当前位置: 首页 > news >正文

leetcode 503. 下一个更大元素 II、42. 接雨水

下一个更大元素 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]

思路:

        /*

            单调栈

            定义一个result用来存下标,和一个栈st用来存元素下标,首先栈先存入数组的第一个元素,从数组的第二个元素element开始比较,

            if(element<=nums[st.top()]) st.push(i);

            else{

                while(!st.empty()&&nums[i]>nums[st.top()]){

                result[st.top()] = i;

                st.pop();

            }

            st.push(i);

            }

            对于循环搜索

            for(int i = 0;i<nums.size()*2;i++)类似遍历两遍

            i= i%nums.size();求模不至于访问数组越界

        */

代码:
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {/*单调栈定义一个result用来存下标,和一个栈st用来存元素下标,首先栈先存入数组的第一个元素,从数组的第二个元素element开始比较,if(element<=nums[st.top()]) st.push(i);else{while(!st.empty()&&nums[i]>nums[st.top()]){result[st.top()] = i;st.pop();}st.push(i);}对于循环搜索for(int i = 0;i<nums.size()*2;i++)类似遍历两遍i= i%nums.size();求模不至于访问数组越界*/vector<int>result(nums.size(),-1);stack<int>st;st.push(0);for(int i = 1;i<nums.size()*2;i++){if(nums[i%nums.size()]<=nums[st.top()]){st.push(i%nums.size());}else{while(!st.empty()&&nums[i%nums.size()]>nums[st.top()]){result[st.top()] = nums[i%nums.size()];st.pop();}}st.push(i%nums.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

思路:

        /*

            采用单调栈

            定义一个栈 用来存下标,首先先把数组的第一个元素下标存入栈,然后从数组的第二个元素开始遍历

            遍历到的元素如果小于栈顶元素,就把该元素的下标存入栈

            遍历到的元素如果大于栈顶元素,就把栈顶元素下标取出记录比该元素大的第一个元素的下标,这个过程是持续性的过程。

            以上就是单调栈

            本题可以找到栈顶元素的比其右边大的元素,即遍历到的元素,左边遍历到的大的元素,即栈顶的下一个元素

           

        */

代码:
class Solution {
public:int trap(vector<int>& height) {/*采用单调栈 定义一个栈 用来存下标,首先先把数组的第一个元素下标存入栈,然后从数组的第二个元素开始遍历遍历到的元素如果小于栈顶元素,就把该元素的下标存入栈遍历到的元素如果大于栈顶元素,就把栈顶元素下标取出记录比该元素大的第一个元素的下标,这个过程是持续性的过程。以上就是单调栈本题可以找到栈顶元素的比其右边大的元素,即遍历到的元素,左边遍历到的大的元素,即栈顶的下一个元素*/stack<int>st;st.push(0);int sum = 0;for(int i = 1;i<height.size();i++){if(height[i]<height[st.top()]){st.push(i);}else if(height[i]==height[st.top()]){st.push(i);}else{while(!st.empty()&&height[i]>height[st.top()]){int mid = st.top();st.pop();if(!st.empty()){ int heigh = min(height[i],height[st.top()])-height[mid];int width = i-st.top()-1;sum += heigh*width;}}}st.push(i);}return sum;}
};

还有很多瑕疵,还需继续坚持!

http://www.lryc.cn/news/206028.html

相关文章:

  • 【德哥说库系列】-PostgreSQL跨版本升级
  • rust学习——智能指针
  • 系列一、Spring Framework
  • PULP Ubuntu18.04
  • Docker harbor私有仓库部与管理
  • 解决虚拟机联网问题
  • Unity 自定义小地图
  • 力扣每日一题66:加一
  • 项目管理工具ConceptDraw PROJECT mac中文版自定义列功能
  • Kafka-Java二:Spring实现kafka消息发送的ack机制
  • Go代码解密:理解byte和int8的边界行为
  • Mac M1下使用Colima替代docker desktop搭建云原生环境
  • Non-constant range: argument must be an integer literal
  • TCP网络通信
  • echarts中,X轴名称过长隐藏,鼠标hove显示全称
  • laravel框架介绍(二) 打开站点:autoload.php报错
  • reactNative导入excel文件
  • mysql 命令行安装
  • JAVA基础知识Fundamental
  • 民宿如何经营与管理?【民宿小程序】
  • 用 Rust 和 cURL 库制作一个有趣的爬虫
  • 华为OD 走方格的方案数(100分)【java】A卷+B卷
  • postgresql|数据库|序列Sequence的创建和管理
  • (完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类
  • Unity中Shader的ShaderLOD
  • 图像压缩(4)《数字图像处理》第八章 8.3节 数字图像水印
  • C++之lambda匿名函数总结(二百四十五)
  • STM32F103单片机内部RTC实时时钟驱动程序
  • ChinaSoft 论坛巡礼 | 开源软件生态健康度量论坛
  • Leetcode.2698 求一个整数的惩罚数