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

代码随想录算法训练营第五十九天|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.mfbz.cn/a/364905.html

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

相关文章

守好“安全关” 筑牢“安全线”—济南中医风湿病医院6S管理小组开展安全生产大检查活动

春节将至&#xff0c;许多患者希望在春节前获得康复&#xff0c;因此预约到院参与会诊的患者数量较多。为营造干净整洁迎佳节的浓厚氛围&#xff0c;提升群众就医满意度&#xff0c;优化就医服务&#xff0c;改善医院医疗环境&#xff0c;结合6S精益管理&#xff0c;做到整理、…

深度学习的新前沿:突破、应用与挑战

引言 深度学习的快速发展已经在人工智能领域引起了革命性的变化。作为模仿人脑结构和功能的强大工具&#xff0c;深度神经网络在图像识别、自然语言处理、医学诊断等多个领域取得了显著成就。但是&#xff0c;随着技术的不断推进&#xff0c;深度学习也在不断地进化和扩展其能…

【QT】贪吃蛇小游戏 -- 童年回忆

成品展示 项目分析&#xff1a; &#x1f40d;基本元素如下 &#x1f40d;小蛇的设计&#xff0c;初始大小蛇头占一个方块&#xff0c;蛇身占两个方块。 &#x1f40d;关于小蛇的移动&#xff0c;采用蛇头前进方向增加一个方块&#xff0c;蛇尾减掉一个方块的实现方法。 &#…

迷你洗衣机哪个牌子好又实惠?最好用的迷你洗衣机分享

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

Vue3_基础使用

vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对一个数据的处理在不同的配置中&#xff0c;当业务复杂时很难维护&#xff0c;修改起来也不好查找。 vue3的组合式&#xff1a;将针对数据的方法计算属性等等放在一…

10.网桥是什么?网桥和路由器及交换机的区别?以太网和令牌环网,nat,查公网ip等

网桥是什么&#xff1f;有什么作用&#xff1f; 网桥是一种网络设备&#xff0c;它可以在数据链路层&#xff08;第二层&#xff09;上连接不同的局域网&#xff08;LAN&#xff09;&#xff0c;并根据MAC地址转发数据帧。网桥的作用是&#xff1a; 隔离碰撞域&#xff0c;提…

QML自定义ComboBox组件,支持动态筛选

QtQuick.Controls提供了ComboBox组件&#xff0c;该组件能够满足日常的下拉选择框的需求&#xff0c;但当需要用户在ComboBox中通过输入关键字进行自动匹配时&#xff0c;原生的组件虽然提供了editable属性用于输入关键字&#xff0c;但是匹配内容不弹出下拉框&#xff0c;无法…

2024年美赛数学建模D题思路分析 - 大湖区水资源问题

# 1 赛题 问题D&#xff1a;大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域&#xff0c;其中包含了这两个国家的许多大城市地区&#xff0c;气候和局部天气条件不同。 这些湖泊的水被用于许多用途&#xff…

《Pandas 简易速速上手小册》第8章:Pandas 高级数据分析技巧(2024 最新版)

文章目录 8.1 使用 apply 和 map 函数8.1.1 基础知识8.1.2 重点案例&#xff1a;客户数据清洗和转换8.1.3 拓展案例一&#xff1a;产品评分调整8.1.4 拓展案例二&#xff1a;地址格式化 8.2 性能优化技巧8.2.1 基础知识8.2.2 重点案例&#xff1a;大型销售数据分析8.2.3 拓展案…

Python之数据分析

【案例】 某公司有2份数据文件&#xff0c;现在需要对其进行数据分析&#xff0c;计算每日的销售额并以柱状图表的形式进行展现。 数据如下&#xff1a; 一月份数据&#xff1a; 二月份数据&#xff1a; 需求分析 根据题目要求我们要得到每日销售额&#xff0c;分析文本数据可以…

一些你可能用到的头文件和函数

1. gets 函数和 fgets 函数。 两者功能相似&#xff0c;都是输入 char 型 字符&#xff0c;但是格式和稳定性有所差别。前者gets稳定性较弱&#xff0c;但是用法简单&#xff0c;格式如下&#xff1a; 现在一些工程都用 fgets 函数&#xff0c;因为它的强大的稳定性&#xff0…

玩转全新nova12系列熄屏显示,做最潮nova星人!

熄屏显示一直是大家非常喜欢的一项功能&#xff0c;可以让我们在不影响他人的情况下随时随时地查看消息提醒。华为nova12全系列机型均支持熄屏显示功能&#xff0c;且在系列上更是有重磅升级&#xff0c;熄屏显示不再只局限于一小块区域&#xff0c;整个屏幕都可以作为显示空间…

【2024美赛C题】网球大佬带你无背景压力分析解题思路!

2024美赛数学建模c题思路分享 加群可以享受定制等更多服务&#xff0c;或者搜索B站&#xff1a;数模洛凌寺 联络组织企鹅&#xff1a;936670395 以下是C题老师的解题思路&#xff08;企鹅内还会随时更新文档&#xff09;&#xff1a; 1背景介绍 2024MCM问题C&#xff1a;网…

基于Python3的OneDrive多网盘挂载程序,带会员/同步等功能,附带系统搭建教程

搭建教程 虚拟主机用户&#xff0c; Apache构架的配置如下&#xff0c;Nginx的我不知道 根目录创建一个.htaccess文件&#xff0c;内容如下&#xff1a; <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !^public RewriteRule ^(…

Git介绍与常用命令总结

Git介绍与其常用命令总结 1、Git介绍2、Git的使用3、Git常用命令3.1 初始化仓库3.2 克隆仓库3.3 配置用户信息3.4 提交代码(Commit)3.5 推送代码(Push)3.6 拉取代码(Pull)3.7 分支(Branch)3.8 远程仓库(Remote)3.9 撤销回退本地改动3.10 更新本地仓库与远程仓库 1、Git介绍 Gi…

2024年美国大学生数学建模竞赛F题思路分析

题目 非法野生动物贸易对环境造成了负面影响&#xff0c;并威胁全球生物多样性。据估计&#xff0c;其涉及高达265亿美元的年交易额&#xff0c;被认为是全球所有非法交易中的第四大。[1] 你需要开发一个基于数据驱动的5年项目&#xff0c;旨在显著减少非法野生动物贸易。你的…

npm 和 yarn 的使用

安装 yarn npm i yarn -g查看版本 npm -v yarn --version切换 npm/yarn 的下包镜像源 // 查看当前的镜像源 npm config get registry// 切换淘宝镜像源 // 新的淘宝源&#xff0c;旧的淘宝源已于2022年05月31日零时起停止服务 npm config set registry https://registry.…

鸿蒙ArkUI日期选择组件

鸿蒙ArkUI日期选择组件&#xff0c;基于基础组件进行的二次封装的日期选择组件&#xff0c;快速实现日期选择。 /*** 日期*/ Component export default struct DiygwDate{//绑定的值Link Watch(onValue) value:string;// 隐藏值State valueField: string value;// 显示值Sta…

【靶场实战】Pikachu靶场不安全的文件下载漏洞关卡详解

Nx01 系统介绍 Pikachu是一个带有漏洞的Web应用系统&#xff0c;在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习&#xff0c;那么Pikachu可能正合你意。 Nx02 不安全的文件下载漏洞概述 文件下载功能在很多web系统上都…

移动机器人激光SLAM导航(二):运动控制与传感器篇

参考引用 机器人工匠阿杰wpr_simulation 1. 机器人运动控制 1.1 测试环境安装 wpr_simulation 安装$ mkdir -p catkin_ws/src $ cd catkin_ws/src $ git clone https://github.com/6-robot/wpr_simulation.git $ cd wpr_simulation/scripts/ $ ./install_for_melodic.sh # 自…