代码随想录算法训练营第59天 | ● 503.下一个更大元素II ● 42. 接雨水

news2024/11/20 12:31:28

文章目录

  • 前言
  • 一、503.下一个更大元素II
  • 二、42. 接雨水
  • 总结

前言

单调栈;


一、503.下一个更大元素II

循环的问题:1.多建立一个数组   2.采用取模的方法;

问题:采用取模,后面的值会被前面的覆盖掉吗?

答:不会,因为采用的单调栈是递增的,所以大的数值会在栈中被保留下去。

下面的是简略版,>= 的情况没有用if表示出来:

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        if(nums == null || nums.length <=1){
            return new int[]{-1};
        }
        int size = nums.length;
        int[] result = new int[size];
        Arrays.fill(result,-1);
        Stack<Integer> st = new Stack<>();
        for(int i =0;i<2*size;i++){
            while(!st.empty() && nums[i%size] > nums[st.peek()]){
                result[st.peek()] = nums[i%size];
                st.pop();
            }
            st.push(i%size);
        }
        return result;
    }
}

二、42.接雨水

当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。

三种解法:1. 暴力 2. 双指针 3. 单调栈

 1.暴力:

按照列来计算如图:

42.接雨水1

首先,如果按照列来计算的话,宽度一定是1了,我们再把每一列的雨水的高度求出来就可以了。从头遍历所有的列,并且要注意第一个柱子和最后一个柱子不接雨水;

2.双指针:

为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),这样就避免了重复计算。

即从左向右遍历:maxLeft[i] = max(height[i], maxLeft[i - 1]);

从右向左遍历:maxRight[i] = max(height[i], maxRight[i + 1]);

3.单调栈:

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。

  1. 首先单调栈是按照行方向来计算雨水,如图:

42.接雨水2

知道这一点,后面的就可以理解了。

  1. 使用单调栈内元素的顺序

从大到小还是从小到大呢?

从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

  1. 遇到相同高度的柱子怎么办。

遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。例如 5 5 1 3 这种情况。如果添加第二个5的时候就应该将第一个5的下标弹出,把第二个5添加到栈中。因为我们要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度

        栈里要保存什么数值

stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度

双指针:

class Solution {
    public int trap(int[] height) {
        int length = height.length;
        if(length <= 2) return 0;
        int[] maxLeft = new int[length];
        int[] maxRight = new int[length];

        maxLeft[0] = height[0];
        for(int i = 1;i<length;i++){
            maxLeft[i] = Math.max(height[i],maxLeft[i-1]);
        }
        maxRight[length-1] = height[length-1];
        for(int i = length-2;i>=0;i--){
            maxRight[i] = Math.max(height[i],maxRight[i+1]);
        }
        int sum = 0;
        for(int i = 0;i<length;i++){
            int count = Math.min(maxLeft[i],maxRight[i]) - height[i];
            if(count > 0) sum += count;
        }
        return sum;
    }
}

单调栈:

class Solution{
    public int trap(int[] height){
        int size = height.length;
        if(size <= 2) return 0;
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(0);

        int sum = 0;
        for(int index = 1;index < size;index++){
            int stackTop = stack.peek();
            if(height[index] < height[stackTop]){
                stack.push(index);
            }else if(height[index] == height[stackTop]){
                stack.pop();
                stack.push(index);
            }else{
                int heightAtIdx = height[index];
                while(!stack.isEmpty() && (heightAtIdx > height[stackTop])){
                    int mid= stack.pop();
                    if(!stack.isEmpty()){
                        int left = stack.peek();
                        int h = Math.min(height[left],height[index]) - height[mid];
                        int w = index -left-1; 
                        int hold = h*w;
                        if(hold > 0) sum += hold;
                        stackTop = stack.peek();
                    }
                }
                stack.push(index);
            }
        }
        return sum;
    }
}


总结

单调栈;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宁波融资融券开户利息率最低是多少?两融利率5%或以下!

宁波融资融券开户利息率最低是多少?两融利率5%或以下&#xff01; 融资融券是指投资者通过借入资金融资&#xff0c;或者借入证券卖出并借入资金购买证券&#xff0c;以达到增加投资收益的一种交易方式。融资融券交易需要满足一定的条件&#xff0c;如投资者必须拥有一定的股…

Go 围炉札记

文章目录 一、Go 安装 一、Go 安装 VScode下配置Go语言开发环境【2023最新】 基础篇&#xff1a;新手使用vs code新建go项目 vscode里安装Go插件和配置Go环境 Documentation Golang 配置代理 Go命令详解 一文详解Go语言常用命令 Go 语言教程 熬夜整理&#xff0c;最全的Go语…

阿里云效自动构建python自动测试脚本

之前一直用的是jenkins自动构建自动化脚本&#xff0c;因为现在的公司统一在阿里云效的流水线上做代码的管理&#xff0c;构建&#xff0c;要求自动化测试也在上面自动构建&#xff0c;故而学习了一下。为自己做一个记录&#xff0c;也给有需要的朋友做一个参考。 1. 新建流水…

大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…

python 为 网易云下载的 本地音乐文件增加 序号

前言 网易云下载的音乐文件&#xff0c;信息挺全的&#xff0c;但是缺少序号&#xff0c;用本地播放器听是乱序的&#xff0c;就很头疼。 遂写一个python脚本解决问题 本python会把基于音乐文件的元信息&#xff0c;重命名文件 到 以下格式 序号 标题.后缀 额外依赖库 muta…

工时表软件如何彻底改变时间跟踪工作?

在工作场所&#xff0c;生产率的下降一直在消耗我们的精力和钱包。你知道吗&#xff0c;每年仅生产力倦怠一项&#xff0c;每位员工就会给企业造成 1,967 美元的惊人损失&#xff01; 好消息是&#xff0c;有一种创新的解决方案可以解决这种生产力下降的问题&#xff0c;它就是…

远程控制桌面软件是否支持远程防护墙配置

远程控制桌面软件是一种便捷的工具&#xff0c;它能够帮助用户在远程访问和操作计算机桌面。然而&#xff0c;远程控制软件是否支持远程防火墙配置这个问题的答案并不是简单的是或否。下面将从软件设计的角度和实际使用情况的角度来解释这个问题。 首先&#xff0c;让我们了解一…

国产自研BI系统,更懂中国企业数据分析需求

国产自研BI系统是指由中国企业自主研发的商业智能&#xff08;BI&#xff09;系统&#xff0c;这类系统更加了解中国企业的数据分析需求&#xff0c;能够提供更加贴合实际的解决方案。比如说奥威BI系统就是典型的国产自研&#xff0c;不仅了解中国企业的数据分析需求&#xff0…

(2022|ICML,Diffusion,引导,ADM)GLIDE:使用文本引导扩散模型实现逼真图像生成和编辑

GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 背景 2.1. 扩…

PCB布线之电源线干扰?|深圳比创达EMC

一客户画户外摄像头的板子&#xff0c;板子上电源线非常多&#xff0c;6层板&#xff0c;电源层已经被分割完了&#xff0c;还有2根电源线&#xff0c;没办法只能并行走线了&#xff0c;板子画完后发主管评审&#xff0c;主管让其在2根电源线中间走一根地线&#xff0c;该客户感…

什么是AI视频智能分析?你真的懂AI视频分析吗?

AI视频分析&#xff0c;顾名思义就是指利用人工智能技术对视频数据进行分析和处理的过程。通过计算机视觉和深度学习等技术&#xff0c;能自动地从视频数据中提取有用的信息、模式与结构&#xff0c;并生成对视频内容的理解和推理。那么&#xff0c;AI视频分析技术包括哪几个方…

oracle客户端的安装(SQL Developer)

参考资料 软件首页&#xff1a;https://www.oracle.com/database/sqldeveloper/ 官方文档&#xff1a;https://docs.oracle.com/en/database/oracle/sql-developer/ 下载地址&#xff1a;https://www.oracle.com/database/sqldeveloper/technologies/download/ 安装指南&#…

GB28181协议-SIP协议详解

1.SIP协议 SIP&#xff08;Session initialization Protocol&#xff0c;会话初始协议&#xff09;是由IETF&#xff08;Internet Engineering Task Force&#xff0c;因特网工程任务组&#xff09;制定的多媒体通信协议。 它是一个基于文本的应用层控制协议&#xff0c;用于…

位图bitset及其应用——【C++实现】

本章代码gitee仓库&#xff1a;位图实现及其应用 文章目录 1.位图的概念2. 位图的实现3. 位图应用 1.位图的概念 当面对海量数据时&#xff0c;我们一般的数据结构无法存储那么多的值&#xff0c;要对这些数据进行分析&#xff0c;我们就可以采用位图来对这些数据进行标记&…

02强化学习基本概念

强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结&#xff1a; 前言 本文来自西湖大学…

PMP考试300条知识点汇总,20天上岸!

PMP考试300条知识点完整内容可在文末获取。 3、项目管理 vs 运营管理 项目与日常运营的共同特征&#xff1a; 由人来做、 受制于有限的资源、需要规划、执行和控制、为了实现组织的目标或战略计划 项目与日常运营的根本区别&#xff1a; 项目是临时的&#xff1b;运营是持…

企业进行品牌推广时怎么才能达到预期广告效应?不如试试软文营销

企业进行品牌推广的目的就在于提升品牌的曝光率&#xff0c;树立该品牌在市场中的形象&#xff0c;加强品牌的影响力与公信力&#xff0c;提高产品的竞争力&#xff0c;那么企业进行品牌推广时怎么才能达到预期效果呢&#xff0c;我们可以试试软文营销&#xff0c;接下来媒介盒…

竞赛选题 基于深度学习的目标检测算法

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

从丢失msvcp140_codecvt_ids.dll到修复,解决方法详解

在日常计算机使用过程中&#xff0c;我们有时会遇到一些烦人的错误提示。其中之一就是丢失了msvcp140_codecvt_ids.dll文件。当我们打开某些应用程序或游戏时&#xff0c;可能会收到类似于“找不到msvcp140_codecvt_ids.dll”或“该应用程序无法正常启动”的错误信息。这可能会…

Guava Cache介绍-面试用

一、Guava Cache简介 1、简介 Guava Cache是本地缓存&#xff0c;数据读写都在一个进程内&#xff0c;相对于分布式缓存redis&#xff0c;不需要网络传输的过程&#xff0c;访问速度很快&#xff0c;同时也受到 JVM 内存的制约&#xff0c;无法在数据量较多的场景下使用。 基…