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

news2024/9/25 13:23:15

503.下一个更大元素II

503. 下一个更大元素 II - 力扣(LeetCode)

思路:单调栈

1. 单调递增栈;在遍历的过程中模拟走两边nums;

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

42. 接雨水

42. 接雨水 - 力扣(LeetCode)

思路1:双指针法

1. 按列计算,宽度为1,从头遍历(注意第一个柱子和最后一个柱子不接雨水),求出每一列雨水的高度(取决于该列左侧最高的柱子和右侧最高的柱子中更矮的那根柱子的高度,即 min(lHeight,rHeight)-height;

2. 将每一列雨水的体积相加,就是总雨水的体积;

class Solution {
    public int trap(int[] height) {
        int sum = 0;
        for(int i = 0;i<height.length;i++){
            if(i==0||i==height.length-1) continue;
            int rHeight = height[i];
            int lHeight = height[i];
            for(int r = i+1;r<height.length;r++){
                if(height[r]>rHeight) rHeight = height[r];
            }
            for(int l = i-1;l>=0;l--){
                if(height[l]>lHeight) lHeight=height[l];
            }
            int h = Math.min(lHeight,rHeight)-height[i];
            if(h>0) sum+=h;
        }
        return sum;
    }
}

思路2:动态规划

1. 把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight);

2. 当前位置,左边的最高高度四前一个位置的左边最高高度和本高度的最大值;即从左往右遍历:maxLeft[i] = max(height[i],maxLeft[i-1]);从右向左遍历:maxRight[i] = max(height[i],maxRight[i+1]);

3. 求和;

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

思路3:单调栈

1. 单调栈按照行方向来计算雨水,如下所示:

42.接雨水2

2. 单调栈内元素的顺序:从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。当添加的柱子高度大于栈头元素时,就说明出现了凹槽;栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

3. 当遇到相同高度的柱子时:更新栈内下标,将栈内元素(旧下标)弹出,将新元素(新下标)加入栈。

4. 栈中元素的类型:int类型即可,表示下标;利用height[stack.peek()]得知弹出下标对应的高度。

5. 单调栈处理逻辑:先将下标为0的柱子加入栈中,然后开始从下标1遍历所有的柱子。当所遍历的元素(柱子)的高度小于栈顶元素的高度时,就将这个元素加入栈中。若所遍历的元素高度等于栈顶元素的高度,就更新栈顶元素。若当前遍历的元素高度大于栈顶元素的高度,取栈顶元素,将栈顶元素弹出,记为mid,对应的高度为height[mid],当前遍历的元素 i 就是凹槽右边的位置,下标为 i ,对应的高度为height[i],雨水高度h为 min(height[st.peek()],height[i])-height[mid];雨水宽度w为凹槽右边的下标-凹槽左边的下标-1,即 i-st.peek()-1;雨水体积为 h*w;

class Solution {
    public int trap(int[] height) {
        int size = height.length;
        if(size<=2) return 0;
        Stack<Integer> stack = new Stack<>();
        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/131473.html

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

相关文章

【MySQL】八,角色管理

创建角色 引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定&#xff0c;可以确保数据的安全性。 语法 CREATE ROLE role_name[host_name] [,role_name[host_name]]...创建一个经理的角色 create role managerlocalhost;给角色赋予权限 创建角色之后&#xff0…

使用 npm link 测试本地编写的 node 模块 / 引入全局安装的 node 模块

目录 1. npm install VS npm install -g 2. npm install -g 的本质&#xff1f;映射脚本的作用&#xff1f; 3. 如何测试使用未发布的 npm 包&#xff1f;npm link 原理&#xff1f; 4. link 到项目 4.1 全局 link 4.2 解除 link 4.3 link 到项目有两种情况&#xff08;…

ansible 第二天

要求&#xff1a; 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下&#xff1a; 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示&#xff1a; 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和…

什么是 Loader、手写 Webpack Loader

目录 1. 什么是 Loader 1.1 Loader 工作原理 1.2 Loader 执行顺序 1.3 内联 Loader 前缀​​​​​​​ 2. 如何开发 Loader 2.1 Loader 长什么样子 2.2 配置本地 Loader 的四种方法 2.2.1 在配置 rules 时&#xff0c;指定 Loader 的绝对路径 2.2.2 在 resolveLoader…

Windows配置万德(Wind)量化接口

原理&#xff1a;wind会在python的第三方库中安装一个属于wind的库 文章目录步骤1:确定python的路径步骤2:配置wind的接口步骤3:检查配置步骤4:使用python提取任意的wind数据步骤1:确定python的路径 如果是默认安装&#xff0c;一般路径是&#xff1a;C:\Users\用户名\Anacond…

磨金石教育摄影技能干货分享|优秀作品欣赏—技巧十足的艺术摄影

想要赏析艺术类的摄影&#xff0c;就得立足于画面身后的意蕴&#xff0c;想作者所想&#xff0c;思作者所思。 这有一定的难度&#xff0c;但也不乏趣味。 今天我们就再来看一组艺术类摄影作品&#xff0c;看看作者如何用高明的技巧表达自己心中的感受吧。 1、江苏省-李玉龙-《…

表白墙 -- 前后端代码详解

表白墙 -- 前后端代码详解一、前端二、后端实现2.1 需求2.2 创建项目及初始化2.3 实现提交数据 (存档)2.3.1 实现 doPost2.3.2 构造请求 (修改 html 文件)2.3.3 验证2.4 实现获取数据 (读档)2.4.1 实现 doGet2.4.2 构造请求 (修改 html 文件)2.4.3 验证三、JDBC 版本 (MySQL)3.…

回味2022

回味20221.前言2.过去的十二个月3.我期望的20231.前言 2021年写给自己的总结&#xff1a;回味2021 一年又一年飞逝的光阴&#xff0c;我想唯有时间留给人的印象最为深刻吧。春去秋来&#xff0c;四季轮回间都是时光的印记。2022年12月30日&#xff0c;25岁的我依旧在这间写下2…

从socket开始讲解网络模式

从socket开始讲解网络模式 windows采用IOCP网络模型&#xff0c;而linux采用epoll网络模型&#xff08;Linux得以实现高并发&#xff0c;并被作为服务器首选的重要原因&#xff09;&#xff0c;接下来讲下epoll模型对网络编程高并发的作用 简单的socket连接 socket连接交互的…

LaoCat带你认识容器与镜像(一)

准备更新一个容器与镜像相关的系列&#xff0c;从Docker到K8s的入门再到实际项目进阶应用&#xff0c;这里感谢好朋友泽鹏&#xff0c;是他让我结识容器与镜像&#xff1b;也感谢上家公司菲恩曼&#xff0c;是它给了我去学习、实践的机会&#xff1b;最后感谢翼哥&#xff0c;一…

Linux系统下at任务调度机制

Linux系统下at任务调度机制 基本介绍 at命令是一次性定时计划任务&#xff0c;at 的守护进程 atd 会以后台模式运行&#xff0c;检查作业队列来运行。默认情况下&#xff0c;atd 守护进程每60秒检查作业队列&#xff0c;有作业时&#xff0c;会检查作业运行时间&#xff0c;如果…

深入理解计算机系统_可重定位目标文件的格式---elf格式

本篇笔记记录可重定位目标文件的格式— elf格式&#xff0c;也是《深入理解计算机系统》第7章的内容。了解这些内容&#xff0c;对我们很有帮助&#xff0c;比如代码排错&#xff0c;可以深入了解C/C 实现原理。 分别介绍如何得到可重定位目标文件及其格式。 2.1 如何得到可重…

操作系统~Linux~线程的互斥,mutex互斥锁的使用及其原理

1.一些基本概念 1&#xff0e;临界资源&#xff1a;凡是被线程共享访问的资源都是临界资源&#xff08;多线程、多进程打印数据到显示器&#xff0c;显示器就是临界资源&#xff09; 2&#xff0e;临界区&#xff1a;代码中访问临界资源的代码&#xff08;在代码中&#xff0c;…

kotlin学习笔记之注解与反射

一、声明并应用注解 一个注解允许你把额外的元数据关联到一个声明上。然后元数据就可以被相关的源代码工具访问&#xff0c;通过编译好的类文件或是在运行时&#xff0c;取决于这个注解是如何配置的。 1、应用注解 在kotlin中使用注解的方法和java一样。要应用一个注解&#xf…

如何通过3个月自学成为网络安全工程师!

前言&#xff1a; 趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&…

Pycharm配置关于pyside6的外部工具

文章目录一、前言二、Pycharm配置1、designer.exe&#xff08;1&#xff09;打开Pycharm的设置&#xff08;2&#xff09;相关参数&#xff08;可复制粘贴&#xff09;2、Pyside6-uic.exe&#xff08;1&#xff09;设置&#xff08;2&#xff09;相关参数&#xff08;可复制粘贴…

Java--抽象类和接口的区别

今天是22年最后一天了, 写篇博客记录一下吧, 这一年发生了很多事情, 也学到了很多知识, 后面要继续加油啊, 大家也要加油啊, 米娜桑. 目录 概述 区别 1. 定义关键字不同 2. 继承或实现的关键字不同 3. 子类扩展的数量不同 4. 属性访问控制符不同 5. 方法控制符不同 6.…

python互联网程序设计GUI程序设计和网络程序设计(人机互动聊天软件)

1&#xff0e;项目意义 1、了解网络的结构&#xff1b; 2、了解网络传输协议&#xff1b; 3、掌握基本的网络编程方法。 2&#xff0e;总体设计 使用 TCP 协议实现人机聊天互动&#xff0c;程序具有服务端和客户端&#xff1a; &#xff08;1&#xff09;必备功能&#xff1…

Java财务在线咨询网站系统财务咨询网

简介 财务咨询网站&#xff0c;可以咨询公司代办&#xff0c;代理记账等一系列的财务问题的资讯服务网站 演示视频 https://www.bilibili.com/video/BV1T54y1H7Ar/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 角色 管理员客服注册用户游客 技术…

Spring之DI入门案例

目录 一&#xff1a;DI入门案例实现思路分析 1.要想实现依赖注入&#xff0c;必须要基于 IOC 管理 Bean 2.Service 中使用 new 形式创建的 Dao 对象是否保留 ? 3.Service 中需要的 Dao 对象如何进入到 Service 中 ? 4.Service 与 Dao 间的关系如何描述 ? 二&#xff1…