秋招打卡011(20230807)

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、算法----》单调栈
    • 1、介绍
    • 2、题目
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.

今天拿到了上周面试的结果,说我基础不错以为能进,结果名额不够了。

有点焦虑,努力吧,秋招才刚开始呢。


提示:以下是本篇文章正文内容

一、今天学习了什么?

  • 写完了代码随想录的单调栈部分的算法题;
  • 其它的没做;

二、算法----》单调栈

1、介绍

如果要在一维数组中,寻找任意一个元素的右边或者是左边第一个比自己大或者小的元素的位置,可以采用「单调栈」,时间复杂度为O(N)。

利用一个栈记录在遍历过程中记录遍历过的元素,重点:

  • 单调栈内只需要存放元素的下标即可;
  • 单调栈内的顺序(顺序是指栈头到栈底),分为:
    • 如果求一个元素右边第一个更大元素,单调栈就是递增的;
    • 如果求一个元素右边第一个更小元素,单调栈就是递减的。

用 temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

739.每日温度2

2、题目


  • 739. 每日温度;(⭐⭐⭐⭐⭐)
    public int[] dailyTemperatures(int[] temperatures) {
        /**
         * - 采用一个单调栈进行遍历数据
         * - 每次都需要找到当前元素的右边第一个更大的元素
         * - 栈底到栈尾存放元素应该是由大到小
         * - 比较栈顶元素和即将入栈元素的大小:
         *  - 当栈顶元素温度小于即将入栈元素的温度时,弹出栈顶元素并设置结果集
         *  - 重复弹出,直至栈为空或者栈顶元素大于入站元素
         */
        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        int[] result = new int[temperatures.length];
        for (int i = 1; i < temperatures.length; i++) {
            while (!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {
                Integer pop = stack.pop();
                result[pop] = i - pop;
            }
            stack.push(i);
        }
        return result;
    }
  • 496. 下一个更大元素 I;
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        /**
         * - 还是使用单调栈,存储在nums2数组中,找到比当前元素大的元素下标
         * - 利用一个map维持映射关系 key是nums2的元素值,value是nums2的元素下标
         * - result保存的是nums2中当前元素的下一个更大元素的下标
         */
        Map<Integer, Integer> map = new HashMap<>();
        Stack<Integer> stack = new Stack<>();
        int[] result = new int[nums2.length];
        Arrays.fill(result, -1);
        for (int i = 0; i < nums2.length; i++) {
            while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) {
                Integer pop = stack.pop();
                result[pop] = i;
            }
            stack.push(i);
            map.put(nums2[i], i);
        }

        int[] ans = new int[nums1.length];
        for (int i = 0; i < nums1.length; i++) {
            int index = result[map.get(nums1[i])];
            if (index == -1) {
                ans[i] = -1;
            } else {
                ans[i] = nums2[index];
            }
        }

        return ans;
    }
  • 503. 下一个更大元素 II;
    public int[] nextGreaterElements(int[] nums) {
        /**
         * - 还是采用栈结构,由于是一个循环数组,所以需要遍历数组中的元素次数多一点
         */
        int length = nums.length;
        int[] ans = new int[length];
        Arrays.fill(ans, -1);
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < 2 * length; i++) {
            while (!stack.isEmpty() && nums[i % length] > nums[stack.peek()]) {
                Integer pop = stack.pop();
                ans[pop] = nums[i % length];
            }
            stack.push(i % length);
        }
        return ans;
    }
  • 42. 接雨水;(⭐⭐⭐⭐⭐)
    // 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
    /**
     height: 数组,柱子高度
     */
    public int trap(int[] height) {
        // base case
        int length = height.length;
        if(length <= 2){
            return 0;
        }
        // 定义一些变量
        int sum = 0;// 最后接的雨水值
        // 单调栈,栈顶到栈底是,按照元素值从小到大,但是存储的是数组中元素下标
        Stack<Integer> stack = new Stack<>();


        stack.push(0);
        for(int i = 1; i < length; i++){
            // 栈中是一定存在元素的
            int stackTopIndex = stack.peek();// 栈顶中元素对应在height数组中的下标

            // 如果新加入的元素,比栈顶的元素小,直接压入栈中
            if(height[i] < height[stackTopIndex]){
                stack.push(i);
            }else if(height[i] == height[stackTopIndex]){
                // 如果新加入的元素,和栈顶的元素值相同,弹出栈顶元素,并且将新元素加入栈中
                stack.pop();
                stack.push(i);
            }else{
                // 情况三:要压入栈中的元素值,大于栈顶的元素值
                int top = stack.peek();
                // 遍历每一个比即将压入栈中小的元素
                while(!stack.isEmpty() && height[i] > height[top]){
                    int cur = stack.pop();// 当前元素为高度
                    // 算雨水量是根据宽度*高度
                    if(!stack.isEmpty()){
                        int left = stack.peek();
                        int h = Math.min(height[left], height[i]) - height[cur];
                        int w = i - left - 1;
                        int res = h * w;
                        sum += res;
                        top = stack.peek();
                    }
                }

                stack.push(i);
            }
        }

        return sum;
    }
  • 84. 柱状图中最大的矩形;
    public int largestRectangleArea(int[] heights) {
        /**
         * - 采用单调栈,栈里存储元素下标
         * - 栈底到栈顶的元素是从小到大
         * - 遍历数组中的元素和栈顶相比,只有当即将入栈的元素小于栈顶元素时,需要计算矩形的面积
         * - 需要重新设置数组元素
         */
        int[] arr = new int[heights.length + 2];
        for (int i = 0; i < heights.length; i++) {
            arr[i + 1] = heights[i];
        }
        int ans = 0;
        Stack<Integer> stack = new Stack<>();
        stack.push(0);

        for (int i = 1; i < arr.length; i++) {
            int peek = stack.peek();
            if (arr[i] > arr[peek]) {
                stack.push(i);
            } else if (arr[i] == arr[peek]) {
                stack.pop();
                stack.push(i);
            } else {
                while (!stack.isEmpty() && arr[i] < arr[peek]) {
                    peek = stack.pop();
                    int mid = arr[peek];
                    peek = stack.peek();
                    int width = i - peek - 1;
                    ans = Math.max(ans, mid * width);
                }
                stack.push(i);
            }
        }
        return ans;
    }


总结

提示:这里对文章进行总结:

记住单调栈用的场景,求数组中离该元素最近的最小或者最大的元素。

遍历数组元素的时候,按照从小到大或者从大到小的顺序添加元素,注意情况的比较和出入栈的时机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker实战-如何去访问Docker仓库?

导语   仓库在之前的分享中我们介绍过,它主要的作用就是用来存放镜像文件,又可以分为是公共的仓库和私有仓库。有点类似于Maven的中央仓库和公司内部私服。 下面我们就来介绍一下在Docker中如何去访问各种仓库。 Docker Hub 公共镜像仓库 Docker Hub 是Docker官方提供的最…

恺英网络宣布:与华为鸿蒙系统展开合作,将开发多款手游

8月5日消息&#xff0c;恺英网络宣布旗下子公司盛和网络参加了华为开发者大会&#xff08;HDC.Together&#xff09;游戏服务论坛&#xff0c;并在华为鸿蒙生态游戏先锋合作启动仪式上进行了亮相。恺英网络表示&#xff0c;将逐步在HarmonyOS上开发多款游戏&#xff0c;利用Har…

使用C#的窗体显示与隐藏动画效果方案 - 开源研究系列文章

今天继续研究C#的WinForm的显示动画效果。 上次我们实现了无边框窗体的显示动画效果(见博文&#xff1a;基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 )&#xff0c;这次介绍的是未在任务栏托盘中窗体的显示隐藏动画效果的实现代码。 1、 项目目录&#xff1b…

tomcat配置文件和web站点部署(zrlog)简介

一.tomcat/apache-tomcat-8.5.70/conf/server.xml组件类别介绍 1.类别 2.Connector参数 3.host参数 4.Context参数 二.web站点部署(以zrlog为例) 1.将zrlog的war包传到webapps下面 2.在mysql数据库中创建zrlog用户并赋予权限 3.完成安装向导&#xff0c;登录管理界面即可…

睡眠助手/白噪音/助眠夜曲微信小程序源码 附教程

简介&#xff1a; 睡眠助手/白噪音/助眠夜曲微信小程序源码 附教程 支持分享海报 支持暗黑模式 包含了音频数据 最近很火的助眠小程序&#xff0c;前端vue&#xff0c;可以打包H5&#xff0c;APP&#xff0c;小程序 后台可以设置流量主广告&#xff0c;非常不错的源码 代码完…

I帧、P帧、B帧、GOP、IDR 和PTS, DTS之间的关系

一.视频传输原理 视频是利用人眼视觉暂留的原理&#xff0c;通过播放一系列的图片&#xff0c;使人眼产生运动的感觉。单纯传输视频画面&#xff0c;视频量非常大&#xff0c;对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储&#xff0c;人们发现视频有大量…

一百四十八、Kettle——Linux上安装的kettle8.2连接Hive3.1.2

一、目标 kettle8.2在Linux安装好后&#xff0c;需要与Hive3.1.2数据库建立连接 二、前提 &#xff08;一&#xff09;在Linux已经安装好kettle并可以启动kettle &#xff08;二&#xff09;版本&#xff1a;kettle8.2.0 Hive3.1.2 Hadoop3.1.3 &#xff08;三&#…

cpu的几核和几线程是什么意思

先说一下i7-12800H 14核 20线程是什么意思 答: 超线程功能先简单的解释下就是:能使一个大核拥有同时处理两个线程的能力. 14核是大小核技术,6个大核,8个小核,小核没有超线程功能 ,比大核的性能要弱些 也就是说6个大核,每个大核都同时处理2个线程, 每个小核只能同时处理…

【六袆 - 国际化】SpringBoot国际化Message

模拟场景校验请求参数 private void checkParam(List<ReqAppAdminDTO> req) {// 校验管理员如果已存在&#xff0c;则抛出已存在异常req.forEach(item -> {AppAdminDO appAdminDO appAdminMapper.selectByAppIdAndAdminNo(item.getAppId(), item.getAdminNo());if (O…

【云原生】深入掌握k8s中Pod和生命周期

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …

记录第一篇被”华为开发者联盟鸿蒙专区 “收录的文章

记录第一篇被”华为开发者联盟鸿蒙专区 “社区收录的文章。 坚持写作的动力是什么&#xff1f; 是记录、分享&#xff0c;以及更好的思考 。

【uniapp】样式合集

1、修改uni-data-checkbox多选框的样式为单选框的样式 我原先是用的单选&#xff0c;但是单选并不支持选中后&#xff0c;再次点击取消选中&#xff1b;所以我改成了多选&#xff0c;然后改变多选样式&#xff0c;让他看起来像单选 在所在使用的页面上修改样式即可 <uni-d…

小白到运维工程师自学之路 第六十七集(Harbor企业镜像仓库部署)

一、概述 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Registry 仓库服务。它以Docker公司开源的Registry为基础&#xff0c;提供了管理 UI。基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成…

Java课题笔记~ AspectJ 对 AOP 的实现(掌握)

AspectJ 对 AOP 的实现(掌握) 对于 AOP 这种编程思想&#xff0c;很多框架都进行了实现。Spring 就是其中之一&#xff0c;可以完成面向切面编程。然而&#xff0c;AspectJ 也实现了 AOP 的功能&#xff0c;且其实现方式更为简捷&#xff0c;使用更为方便&#xff0c;而且还支…

vue中transition动画的使用

1.vue文件 说明&#xff1a;加name属性 <transition name"sort"><div class"sort" v-show"show"><div class"all-sort-list2" click"goSearch"><div class"item bo" v-for"(item1, in…

【深入探索Docker】:开启容器化时代的技术奇迹

深入探索Docker 深入探索Docker&#xff1a;开启容器化时代的技术奇迹前言1. 容器化&#xff1a;实现快速部署和可移植性2. 虚拟化&#xff1a;提高安全性和可靠性3. 映像&#xff1a;打包应用及依赖项的模板4. 网络管理&#xff1a;连接容器和主机5. 持久化数据&#xff1a;保…

Packet Tracer - IPv4 和 IPv6 编址故障排除

Packet Tracer - IPv4 和 IPv6 编址故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 10.10.1.1 255.255.255.0 N/A G0/1 192.168.0.1 255.255.255.0 N/A 2001:DB8:1:1::1/64 N/A G0/2 2001:DB8:1:2::1/64 N/A S0/0/0 …

分布式 - 服务器Nginx:一小时入门系列之HTTP反向代理

文章目录 1. 正向代理和反向代理2. 配置代理服务3. proxy_pass 命令解析4. 设置代理请求headers 1. 正向代理和反向代理 正向代理是客户端通过代理服务器访问互联网资源的方式。在这种情况下&#xff0c;客户端向代理服务器发送请求&#xff0c;代理服务器再向互联网上的服务器…

【GitOps系列】如何实施自动化渐进式交付?

文章目录 前言自动渐进式交付概述自动渐进式交付准备创建生产环境创建 AnalysisTemplate访问生产环境安装Prometheus配置 Ingress-Nginx 和 ServiceMonitor验证 Ingress-Nginx 指标 自动渐进式交付实战自动渐进式交付成功自动渐进式交付失败 结语 前言 在实施金丝雀发布的过程中…

webpack性能优化

文章目录 1. 性能优化-分包2. 动态导入3. 自定义分包4. Prefetch和Preload5. CDN加载配置6. CSS的提取7. terser压缩7.1 Terser在webpack中配置7.2 css压缩 8. Tree Shaking 消除未使用的代码8.1 usedExports 配置8.2 sideEffects配置8.3 CSS实现Tree Shaking 9. Scope Hoistin…