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

news2024/10/5 21:26:09

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

下一个更大元素II

503.下一个更大元素II
文章讲解:https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0II.html
题目链接:https://leetcode.cn/problems/next-greater-element-ii/
视频讲解:https://www.bilibili.com/video/BV15y4y1o7Dw/

自己看到题目的第一想法

按照单调栈的第一题每日温度做代码逻辑,然后结合循环数组做改造。

看完代码随想录之后的想法

处理循环数组只需要将2个数组拼在一起,使用单调栈求下一个最大值就可以。不过这里会浪费一些空间。
可以直接将for循环执行2个size。然后在使用i匹配的地方都按照nums取模。

自己实现过程中遇到哪些困难

这里的循环数组一定要理解题意,只循环一次,不会无限循环。拿最后的和前面的比。

public int[] nextGreaterElements(int[] nums) {
    int[] result = new int[nums.length];
    Arrays.fill(result,-1);
    Stack<Integer> stack = new Stack<>();
    stack.push(0);
  
    for(int i = 1; i < 2 * nums.length ; i++){
        while(!stack.isEmpty() && nums[i % nums.length] > nums[stack.peek()]){
            result[stack.peek()] = nums[i % nums.length];
            stack.pop();
        }
        stack.push(i % nums.length);
    }
    return result;
}

接雨水

42. 接雨水
文章讲解:https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html
题目链接:https://leetcode.cn/problems/trapping-rain-water/
视频讲解:https://www.bilibili.com/video/BV1uD4y1u75P/

自己看到题目的第一想法

直接看题解

看完代码随想录之后的想法

分三种做法:
一、暴力解法
面积的计算按照列来计算,该列的高度与两边的最高高度的差值减去当前高度值即为可接雨水的面积值。
遍历当前节点,每遍历到当前节点时,向后遍历、向前遍历,拿到leftHeight和rightHeight。然后再进行计算:
int h = min(lHeight, rHeight) - height[i];
if (h > 0) sum += h; // 注意只有h大于零的时候,在统计到总和中
二、双指针优化
为了减少每次循环左右2边的最高值重复的计算,这里使用maxLeft和maxRight两个数组去记录每一个位置的左边最高高度记录(maxLeft)和右边最高高度记录(maxRight)
lHeight = maxLeft[i] = max(maxLeft[i-1],height[i]);
rHeight = maxRight[i] = max(maxRight[i+1],height[i]);
这里注意0位置和length-1位置
两次循环求出maxLeft和maxRight的所有值后,再使用一次循环求出最终的结果。
这样讲暴力法一的方法时间复杂度从O(n2)降到了O(n)。

三、单调栈
按照行去计算面积。栈内存储索引而不是值。栈内的元素从栈顶到栈底使用递增去存储。
整体分3种情况:
元素大于栈顶:将当前栈顶元素pop出来,新的栈顶和当前元素即为原栈顶的左右2个高,取较小的高然后再和原栈顶做减法然后再乘以右索引减去左索引。
元素等于栈顶:将原栈顶pop出来,新元素push进去。
元素小于栈顶:将元素push进去。
在计算过程中求和。要理解下面的图:
在这里插入图片描述

自己实现过程中遇到哪些困难

计算的整体思路差不多,刚开始没理解按行计算时的weight的下标为何按左右相减,后面按照代码随想录里的按行计算的图做了一遍推导后理解了。
代码:

public int trap(int[] height) {
    if(height.length <= 2){
        return 0;
    }
    int result = 0;
    Stack<Integer> stack = new Stack<>();
    stack.push(0);
    for(int i = 1; i < height.length; i++){
        //三种情况
        // 元素大于栈顶:将当前栈顶元素pop出来,新的栈顶和当前元素即为原栈顶的左右2个高,取较小的高然后再和原栈顶做减法然后再乘以右索引减去左索引。
        // 元素等于栈顶:将原栈顶pop出来,新元素push进去。
        // 元素小于栈顶:将元素push进去。  
        if(height[i] < height[stack.peek()]){
            stack.push(i);
        }else if(Objects.equals(height[i],height[stack.peek()])){
            stack.pop();
            stack.push(i);
        }else{
            while(!stack.isEmpty() && height[i] > height[stack.peek()]){
                int mid = stack.pop();
                if(!stack.isEmpty()){
                    int h = Math.min(height[stack.peek()], height[i]) - height[mid];
                    // 雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度)
                    int w = i - stack.peek() - 1 ;
                    result += h*w;
                } 
            }
            stack.push(i);
        }
    }
    return result;
}

今日收获&学习时长

这两题用了比较长的时间,刷题刷的比较慢。核心还是要记住单调栈用在比较相邻的两个数上。

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

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

相关文章

2024年美赛 (C题MCM)| 温网积分 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的C题&#xff01; 完整内容可以在文章末尾领…

2024美赛数学建模F题思路分析 - 减少非法野生动物贸易

1 赛题 问题F&#xff1a;减少非法野生动物贸易 非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c;…

服务器C盘突然满了,是什么问题

随着时代的发展、互联网的普及&#xff0c;加上近几年云计算服务的诞生以及大规模普及&#xff0c;对于服务器的使用目前是非常普遍的&#xff0c;用户运维的主要对象一般也主要是服务器方面。在日常使用服务器的过程中&#xff0c;我们也会遇到各式各样的问题。最近就有遇到用…

SpringBoot RestTemplate 设置挡板

项目结构 代码 BaffleConfig /*** Description 记录配置信息* Author wjx* Date 2024/2/1 14:47**/ public interface BaffleConfig {// 是否开启挡板的开关public static boolean SWITCH true;// 文件根目录public static String ROOT_PATH "D:\\TIS\\mock";// …

Attack Lab:Phase1~Phase5【缓冲区溢出实验】

注&#xff1a;本实验所用文件不是csapp官网给出的&#xff0c;是学校下发的。可以参考我的思路。 phase 1 本阶段目标是使getbuf调用结束后&#xff0c;控制权交给touch1函数。 则我们要知道两件事&#xff1a;一是缓冲区大小&#xff0c;二是touch1在虚拟内存中的位置。 用…

如何取消隐藏Excel中的行?这里提供详细步骤

取消隐藏Microsoft Excel电子表格中的所有行就像按下键盘快捷键或使用功能区上的按钮一样简单。我们将向你展示如何操作。 如何使用快捷方式取消隐藏Excel中的所有行 若要在电子表格中显示隐藏行&#xff0c;请使用Microsoft Excel启动电子表格。然后&#xff0c;访问包含隐藏…

P1083 [NOIP2012 提高组] 借教室

P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间&#xff0c;经常需要租借教室。大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。 面对海…

【项目日记(七)】第三层: 页缓存的具体实现(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

Armv8-M的TrustZone技术之在安全状态和非安全状态之间切换

Armv8-M安全扩展允许在安全和非安全软件之间直接调用。 Armv8-M处理器提供了几条指令来处理状态转换: 下图显示了安全状态转换。 如果入口点的第一条指令是SG且位于非安全可调用内存位置中,则允许从非安全到安全软件的直接API函数调用。 当非安全程序调用安全API时,API通过…

Linux系统管理和Shell脚本笔试题

1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;(1) 删除所有空行&#xff1b;(2) 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1a;AAA11111BBB #写入内…

JavaWeb前端——HTML/CSS

HTML/CSS概述 HTML&#xff1a;学习标签&#xff0c;CSS&#xff1a;学习样式 HTML 1. 不区分大小写。 2. 属性可以使用单引号/双引号 3. 在记事本/编辑器中编写html语言&#xff0c;通过浏览器解析渲染语言 4. 语法结构松散&#xff08;编写时要尽量严谨&#xff09; VSc…

github请求超时解决方法

github请求超时解决办法 我使用windows执行如下git命令,提示超时 git clone xxxxx命令行提示如下&#xff1a; Failed to connect to github.com port 443: Timed out问题排查 可我Chrome可以正常访问github甚至ChatGPT&#xff0c;但是为什么在命令行里面却无法访问&#…

AI大模型开发架构设计(7)——人人都需要掌握的AI编程及应用案例实战

文章目录 人人都需要掌握的AI编程及应用案例实战1 AI代码生成模型与AI编程助手介绍程序设计方式的发展自动代码生成AI编程工具 2 AI编程助手的代码生成模型架构剖析以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模…

『C++成长记』string使用指南

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 &#x1f4d2;2.1string类对象的常…

线下店铺的商品如何查价

品牌渠道主要分为线上和线下&#xff0c;线上的价格查价方式可以通过系统完成&#xff0c;系统筛选不同平台的数据&#xff0c;然后做价格的比较&#xff0c;输出是否破价的监测报表&#xff0c;这个过程多依赖系统去操作&#xff0c;但线下店铺的产品价格查价方式则没有固定的…

Windows下Cloudreve WebDAV挂载失败解决方法

如果你正在使用Windows的资源管理器挂载WebDAV&#xff0c;并且发现挂载失败&#xff0c;无论你如何去配置他 首先&#xff0c;Cloudreve 中可以为每个用户组单独设置“是否允许使用WebDAV访问”的开关&#xff0c;但是这玩意儿默认是开启的&#xff0c;所以如果不小心手残关掉…

机器学习系列——(六)数据降维

引言 在机器学习领域&#xff0c;数据降维是一种常用的技术&#xff0c;旨在减少数据集的维度&#xff0c;同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题&#xff0c;提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…

解锁文档处理的全新维度:ONLYOFFICE 文档开发者版

前言 相信大家对于 ONLYOFFICE 这款办公软件可能已经有所耳闻&#xff0c;最近因工作需要&#xff0c;我在众多办公协作工具中选择了 ONLYOFFICE&#xff0c;原因主要是它开源经济实惠&#xff0c;可以部署在自己的服务器上并且能够轻松集成到我们的平台中。在数字化信息时代&…

10、数据结构与算法——堆

一、什么是堆 堆是一种特殊的树形数据结构&#xff0c;通常实现为完全二叉树或满二叉树。堆又分为两种类型最大堆&#xff08;Max Heap&#xff09; 和 最小堆&#xff08;Min Heap&#xff09; 1.1、什么是二叉树 二叉树是一种数据结构&#xff0c;它是由n&#xff08;n≥0&a…

Python 计算两个时间之间的耗时

博主按照自己的需求写的一个可以计算程序耗时的函数&#xff0c;各位有需要的自行改写哈 实现的大致功能 功能1 记录开始时间&#xff0c;返回一个时间字典。数据包括&#xff1a;开始时间的日期格式、文本格式 功能2 记录结束时间和耗时&#xff0c;返回一个时间字典。数据包…