代码随想录刷题Day59 | 503. 下一个更大元素 II | 42. 接雨水

news2025/1/15 13:17:06

代码随想录刷题Day59 | 503. 下一个更大元素 II | 42. 接雨水

503. 下一个更大元素 II

题目:

给定一个循环数组 numsnums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素

数字 x下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

思路:

看到这道题,就想那我直接把两个数组拼接在一起,然后使用单调栈求下一个最大值不就行了!

确实可以!

讲两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。

这种写法确实比较直观,但做了很多无用操作,例如修改了nums数组,而且最后还要把result数组resize回去。

resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了一个O(n)的操作。

其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。

代码:

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int[] ans = new int[nums.length];
        for(int i = 0; i < ans.length; i++){
            ans[i] = -1;
        }
        Stack<Integer> s = new Stack<>();
        for(int i = 0; i < nums.length * 2; i++){
            if(s.empty() || nums[i % nums.length] <= nums[s.peek() % nums.length]){
                s.push(i);
            }else{
                while(!s.empty() && nums[i % nums.length] > nums[s.peek() % nums.length]){
                    int index = s.pop();
                    ans[index % nums.length] = nums[i % nums.length];
                }
                s.push(i);
            }
        }
        return ans;
    }
}

42. 接雨水

题目:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

img

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

思路:

动态规划解法

在上一节的双指针解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。

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

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

当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。

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

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

这样就找到递推公式。

代码:

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

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

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

相关文章

云与开源,共植数字世界的根

摘要&#xff1a;本文整理自阿里巴巴集团副总裁、阿里巴巴开源技术委员会负责人贾扬清&#xff0c;在 Flink Forward Asia 2022 主会场的开场致辞。Tips&#xff1a;点击「阅读原文」获取演讲 ppt&#xff5e;云和开源&#xff0c;共生、共长、共植数字世界的根。从在云上使用开…

SAP PS 第17节 项目产成品产出

SAP PS 第17节 项目产成品产出及差异处理1 模拟场景说明1.1 拖拽负库存1.2 发料原材料及报工1.3 执行副产品入库migo发预留1.4 CNS0交货1.5 后面开票产生收入按照项目结算即可项目上有一类比较另类的玩法&#xff0c;就是舍弃PP&#xff0c;依靠网络活动的负库存&#xff0c;实…

Web前端大作业—个人网页(html+css+javascript)我的家乡新密 (15页)含课程设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

2030年销售额突破200亿美元!瑞萨电子揭秘智能汽车版图

汽车正在成为继手机之后的下一个智能终端&#xff0c;并且已经成为全球各大芯片头部厂商的必争之地。 过去&#xff0c;汽车芯片市场主要由恩智浦、瑞萨电子、TI等传统汽车芯片巨头垄断&#xff0c;外来者鲜有机会可以入局。但近几年&#xff0c;包括高通、英特尔等全球各大芯…

【无人机】基于Fast行军树(FMT)求解无人机故障路径规划问题附matlab代码和论文

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

ElementPlus弹窗之后让外部区域可编辑

原始的el-dialog弹出以后外部区域是不可编辑的。 为最外层的父元素添加样式 同时给dialog本身添加样式

【工作日推算】JS计算当前时间前N个工作日(去除周末及节假日,文尾附源码下载)

【写在前面】前些日子忙了几天有关指标对比分析的功能&#xff0c;因为系统是对接券商类的业务&#xff0c;所以他们比较关注的是工作日的数据波动&#xff0c;因此前端指标对比数据需要拿工作日的&#xff0c;不然他们停市的数据比较也没用&#xff0c;故而今天针对之前实现的…

如何快速搞懂一家公司?

如果没有快速作为前提&#xff0c;你的搞懂&#xff0c;价值会大打折扣。 一.研究一家公司需要的宏观视野 1.把握长期明确趋势 看清宏观大背景能为你搞懂公司做出铺垫&#xff0c;同时看清这个公司和宏观的密切程度是怎样的&#xff0c;也决定了需要多大程度关注宏观变化。 …

【基于Pycharm的Django3教程】Part1:初识Django

文章目录1 初识Django1.1 django的安装1.2 创建django项目1.3 两种创建方式的对比1.4 默认文件介绍1.5 APP的创建和说明1.6 启动运行django1.7 模板和静态文件1.8 模板语法1.9 请求和响应1.10 orm数据库操作1.11 ORM 数据库案例&#xff1a;用户管理1 初识Django 1.1 django的…

22 条 API 设计的最佳实践

在这个微服务的世界里&#xff0c;后端API的一致性设计是必不可少的。 今天&#xff0c;我们将讨论一些可遵循的最佳实践。我们将保持简短和甜蜜——所以系好安全带&#xff0c;出发咯&#xff01; 首先介绍一些术语 任何API设计都遵循一种叫做“面向资源设计”的原则&#…

TOWER x Binance NFT 桥接教程

TOWER x Binance NFT 销售的 TOWER 门票和人物化身皮肤 NFT 现在可以从 BNB 链桥接到 Polygon 啦&#xff01; 一起来看看如何将你的 TOWER x Binance NFT 从 BNB 链转移到 Polygon&#x1f447; 1、到 BinanceNFT 用户中心提取你的 TOWER NFT 到 BNB Chain&#xff0c;然后等待…

html多个好看的背景动态效果(附源码)

文章目录1.设计来源1.1 图片轮动背景1.2 星空流星背景1.3 动态美女背景1.4 动态屋雨背景1.5 动态街道背景1.6 动态夜幕背景2.效果和源码2.1 动态效果2.2 透明度配置2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/arti…

在线绘制富集分析多组气泡图和单细胞分析marker基因矩阵气泡图

常规的GO或者KEGG通路富集分析结果通常以气泡图的形式展示&#xff0c;然而这个气泡图仅仅是一个比较的结果&#xff0c;如果想在一张图上展示多个比较的结果&#xff0c;就需要用到多组气泡图&#xff08;图1&#xff0c;左侧&#xff09;。 单细胞RNA-seq分析结果中&#xf…

delphi异步与javascript

delphi及C Builder异步处理与javascript 目录 delphi及C Builder异步处理与javascript 1、用于实现异步事件、异步方法、及其异步结果回调的可自定义的通用类型 2、你可引用以下基于接口化对象和异步结果的接口的抽象类&#xff0c;去实现异步方法或异步事件的自定义类 2.…

关于DDoS攻击,这些基本概念你一定要知道!

什么是DDoS攻击 DDoS是Distributed Denial of Service的简称&#xff0c;中文是分布式拒绝服务。 这有点拗口吧&#xff1f; 这样&#xff0c;我们先理解下DDoS的前身DoS&#xff08;Denial of Service&#xff09;&#xff0c;即拒绝服务。 最基本的DoS攻击就是攻击者利用…

基础--吊打面试官--精通synchronized底层实现原理

synchonized是一个字段 1.0之前太慢&#xff0c;重&#xff0c;jdk1.0后修改&#xff0c;变得轻.修改的原理是&#xff1a;以前是涉及到用户态和内核态的交互&#xff0c;现在是用户态实现。 基本概念理解&#xff1a; 用户态和内核态的概念&#xff1a;程序的不同级别。内核态…

Vue学习:事件处理(与用户产生交互-点击)

Vue对元素绑定事件&#xff0c;需要使用指令&#xff0c;也就是v-开头 v-on&#xff1a;当什么什么时候时候 点击-出现弹窗&#xff1a;使用method方法 <!-- 准备容器 --><div idroot> <h2>欢迎页面&#xff0c;你好 {{name}}</h2><!-- v-on:click…

(附源码)小程序 法律全书 毕业设计 280844

小程序spring boot法律全书管理系统 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;小程序法律全书被用…

计算机毕业设计ssm+vue基本微信小程序的灾情救助系统 uniapp 小程序

项目介绍 自新冠疫情爆发以来,给各行各业带来了前所未有的挑战。国务院、党中央高度重视灾情救助工作,研究出一系列重要的措施和方法。并广泛利用信息化技术手段,对灾情信息发布、救助管理等进行管理。对于受灾地区来说,存在管理难度大,手段单一,灾民流动性复杂等问题。单靠人…

git 暂存当前分支修改,切换到别的分支

收藏&#xff0c;原文链接Git学习记录-git保留/丢弃当前分支修改并切换至其他分支 - 爱写bug的程序员 - 博客园 (cnblogs.com) 笔者在本地终端进行 git 工作目录的相关处理时&#xff0c;遇到由于某种情况需要使用 git checkout 命令切换到其他分支的情景。此时&#xff0c;若…