随想录Day59--单调栈: 503.下一个更大元素II , 42. 接雨水

news2024/9/21 4:24:16

看到下一个更大,最先想到的就是单调栈。所以503.下一个更大元素II可以用单调栈的思路进行求解,其实这道题和496.下一个更大元素 I的思路是一样的,不过是多了一个首位相连的环状条件,这时候可以想到,把数组再复制遍历,用两个数组拼接成一个数组后再寻找下一个最大的元素,最后的结果只返回单个数组的大小就可以了。这个思路是最直接的,当然牺牲的数组的一个扩充空间。取巧简化的方法是,当你遍历到最后一个数组元素后,怎么再重头遍历,那就是用取余%来做,把数组遍历两遍,i的取值取余数组的长度,这样越过最后一个数组后就可以从头再来了。具体看代码可以更加清晰理解。

42. 接雨水这道题一开始做还是有点难的,但是只要理解里面的思路就会清晰很多。思路可以看卡哥视频,对整道题有着更加深入的理解,其实就是找到右边的第一个更大值,然后单调栈存放着是左边的第一个更大值,两个更大值之间就会产生凹槽,计算凹槽的面积就是雨水面积。特殊处理就是前面都是0或者是连着递增的数组都是无法存放雨水,对这个进行处理一下就可以了。

503. 下一个更大元素 II

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

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

示例 1:

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

示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109
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);//默认全部初始化为-1
        Stack<Integer> st= new Stack<>();//栈中存放的是nums中的元素下标
        for(int i = 0; i < 2*size; i++) {
            while(!st.empty() && nums[i % size] > nums[st.peek()]) {
                result[st.peek()] = nums[i % size];//更新result
                st.pop();//弹出栈顶
            }
            st.push(i % size);
        }
        return result;
    }
}

42. 接雨水

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

示例 1:

输入: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 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

 思路就是先把最低的填平,在填比较高的

class Solution {
    public int trap(int[] height) {
        int len = height.length;
        Deque<Integer> deque = new LinkedList<>();
        int res = 0;//存放雨水面积
        int h = 0;//单个雨水凹槽高度
        int w = 0;//雨水凹槽的宽度
        int t = 0;
        //去掉左边都是0的情况
        while(t < len && height[t] == 0){
            t++;
        }
        deque.push(t);
        for(int i = t + 1; i < len; i++){
            //找到右边第一个更大值
            while(!deque.isEmpty() && height[i] > height[deque.peek()]){
                int temp = deque.pop();
                //如果弹出后为空,那就不计算面积,例如height = [2,3]时,遇到3,2弹出,23之间没有更小的,没有凹槽。
                if(deque.isEmpty()){
                    break;
                }
                //高度就是两个更大值取一个小的,减去自己的高度
                h = Math.min(height[deque.peek()], height[i]) - height[temp];
                //宽度就是两个更大值之间的距离-1,侧面也说明了如果是连在一起的,是没有凹槽的。因为宽度是0。
                w = i - deque.peek() - 1;
                res = res + h * w;
            }
            deque.push(i);
        }
        return res;
    }
}

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

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

相关文章

推荐系统|多目标建模|多目标优化|跨域多目标算法演进

目录 多目标建模总结 推荐系统——多目标优化 网易严选跨域多目标算法演进 背景介绍 多目标建模及优化 1.样本与特征 2. 模型结构迭代 3. 位置偏差与 Debias 4. 多目标 Loss 优化 5. 跨域多目标建模 多目标建模总结 http://t.csdn.cn/H514i 常见的指标有点击率CTR、…

电、气物联网联合管理监测方案

一、概述 水、电、气联合管理就是把同一个用户的用电计量和用水计量、用气计量统一到一个账户&#xff08;同时具有子账户&#xff09;&#xff0c;用一套软件进行统一管理&#xff0c;当账户余额不足时&#xff0c;可实行停电催费&#xff0c;从而既达到预付费的目的&#xff…

hue源码编译,替换cloudera manage hue,解决hue滚动条bug问题

一.安装依赖 yum install python python-dev python-setuptools python-pip \ libkrb5-dev libxml2-dev libxslt-dev libssl-dev \ libsasl2-dev libsqlite3-dev libldap2-dev \ libffi-dev nodejs npm cmake make gcc g++ 二.拉取源码 wget https://github.com/cloudera/hue/a…

机器学习笔记之K近邻学习算法

机器学习笔记之K近邻学习算法 引言回顾&#xff1a;投票法回顾&#xff1a;明可夫斯基距离 K \mathcal K K近邻算法算法描述 K \mathcal K K值的选择小插曲&#xff1a;懒惰学习与急切学习 KD \text{KD} KD树描述及示例 K \mathcal K K近邻 VS \text{ VS } VS 贝叶斯最优分类器…

汽车基础软件信息安全与AUTOSAR

AUTOSAR 信息安全框架和关键技术分析 随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。在这同时,汽车也慢慢成为潜在的网络攻击目标,汽车的网络安全已成为汽车安全的基础,受到越来越多的关注和重视。AUTOSAR 作为目前全球范围普遍认可的汽车嵌入式软件架…

HDFS FileSystem 导致的内存泄露

目录 一、问题描述 二、问题定位和源码分析 一、问题描述 ftp程序读取windows本地文件写入HDFS&#xff0c;5天左右程序 重启一次&#xff0c;怀疑是为OOM挂掉&#xff0c;马上想着就分析 GC日志了。 ### 打印gc日志 /usr/java/jdk1.8.0_162/bin/java \-Xmx1024m -Xms512m …

Net2FTP搭建免费web文件管理器『打造个人网盘』

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人存储文件资料&#xff0c;还是商业文件流转&#xff0c…

老杨说运维 | 数智时代,运维一体化如何落地实践?

在IT运维的发展过程中&#xff0c;随着分布式架构的加速推进&#xff0c;云原生技术加入应用&#xff0c;运维工具相比过去呈现出了更高强度的进化态势&#xff0c;即从多个相对独立的软件向EA形态的一体化系统进化。本次樱花论坛正是基于这一新的变革点&#xff0c;邀请了行业…

(十二)rk3568 NPU 中部署自己训练的模型,(2)模型转换

对于rknn 模型部署,本人使用*.pt -> *.onnx -> *.rknn的方式。 一、首先是pt文件到onnx文件的转换。 onnx文件导出时,需要修改models/yolo.py文件中的后处理部分。 注意:在训练时不要修改yolo.py的这段代码,训练完成后使用export.py进行模型导出转换时一定要进行修…

RHCE第六次作业

目录 一、编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh 2.执行脚本并查看是否创建成功 二、编写脚本for2.sh,使用for循环,通过…

微积分:微分

目录 1.代数推导 2.几何推导 3.总结 1.代数推导 假设我们有一个正方形初始边长为X&#xff0c;这时面积S1x 然后正方形的边长增加△x&#xff0c;此时面积S2&#xff08;x△x&#xff09; 变化的面积大小是△s&#xff08;x△x&#xff09;- x2x△x&#xff08;△x&#x…

软件测试外包干了4年,感觉废了..

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c++算法——枚举法

枚举概念 枚举法是通过计算机速度快的特点&#xff0c;对问题所有可能性进行枚举&#xff0c;从中找到答案&#xff0c;需要利用循环。 例题 1&#xff0c;简单数字谜 题目描述 在□内填上一个合适的相同的数字&#xff0c;使等式“□365283□8256”成立。 输入格式 无 输出…

5.2 构造数值积分公式的基本方法与有关概念

学习目标&#xff1a; 如果要学习构造数值积分公式的基本方法与有关概念&#xff0c;可以遵循以下步骤&#xff1a; 1.了解数值积分的基本概念和性质&#xff1a;包括积分的定义、积分的性质、数值积分的定义及其误差等。这可以通过课本或相关的学习资料来了解。 2.掌握构造…

ubuntu 安装vmware tool(优先安装最新ubantu,可以不安装vmware tools)

1在虚拟机种站到安装vmware-tools 然后重启虚拟机 2在磁盘中可以看到如下文件&#xff0c;将zip文件移动到桌面解压备用 3关闭虚拟机 找到编辑虚拟机设置 4点击左侧 CD/dvd(SATA) 如果是使用镜像文件&#xff0c;改成使用物理驱动器. 5 打开命令行 cd 桌面 &#xff08;如…

yara规则--构建yara规则库

零、快速构建yara规则库的方案 Yara官方预置的规则库&#xff0c;链接 https://github.com/Yara-Rules/rules ClamAV的特征码转换为yara规则&#xff0c;利用工具clamav_to_yara.py将clamav的特征码转换为yara规则 从yara-generator爬取别人上传的样本的规则 利用 yarGen工具 …

电容笔和触控笔有什么区别?2023平价好用的电容笔测评

无论是导电的材料&#xff0c;还是工作的原理&#xff0c;还是操作的方式&#xff0c;甚至是价格&#xff0c;电容笔都和一般的触控笔有着明显的区别。电容笔具有更小的笔尖&#xff0c;并且具有更好的耐磨性。而且现在科技进步很快&#xff0c;IPAD的市场也越来越大&#xff0…

【蓝桥杯省赛真题18】python阴影图形面积 青少年组蓝桥杯python编程省赛真题解析

目录 python阴影图形面积 一、题目要求 1、编程实现 2、输入输出

Linux-零拷贝及Java实现

RabbitMQ比RocketMQ、Kafka较慢点一点重要原因就是 零拷贝 什么是零拷贝&#xff1f; 零拷贝指的是在进行IO的时候减少或避免让CPU拷贝数据&#xff08;数据在IO缓冲区中进行拷贝&#xff09; 零拷贝的优点&#xff1a; 减少甚至完全避免不必要的CPU拷贝&#xff0c;从而让C…

paddlepaddle 的 CPU 和 GPU

想记录一下一个 bug 改了一上午改到最后发现并没有 bug 的 bug。 总结&#xff1a; 因为下午要跑很久&#xff0c;为了省 GPU 算力&#xff0c;我想上午先用 CPU 把数据处理部分跑出来&#xff08;感觉数据处理部分不像网络训练那样涉及太多计算&#xff0c;所以感觉用 CPU 就…