首页 > 其他分享 >(59/60)下一个更大元素Ⅱ、接雨水

(59/60)下一个更大元素Ⅱ、接雨水

时间:2024-03-28 17:13:06浏览次数:20  
标签:59 nums int top 雨水 height 60 st size

终于接到你

下一个更大元素Ⅱ

leetcode:496. 下一个更大元素 I

单调栈

思路

主要是循环数组的处理。

直接等效为长度为2N,重复两遍的原数组即可,i<nums.size()变为i<2*nums.size()i变为i%nums.size()

代码实现

对每个元素都再遍历一遍原数组长度,,,时间复杂度O(N^2),超时了

class Solution {
public:
/*
走了一圈如果又找到自己了说明自己是最大的,最大的为-1
遍历
*/
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> result(nums.size(),-1); // result存的是下一个更大元素值
        stack<int> st;  // 栈存下标
        st.push(0);
        int curIndex = 0;
        for(int i = 1;i < nums.size();i++){
            int j = i;
            do{
                if(j == nums.size()) j = 0;
                while(!st.empty() && nums[j] > nums[st.top()]){
                    result[st.top()] = nums[j];
                    st.pop();
                }
                st.push(j);
                j++;
            }while(j != i);
        }

        return result;
    }
};

正确的循环数组处理:

class Solution {
/*
循环两倍数组长度就行了
*/
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> result(nums.size(),-1); // result存的是下一更大元素值
        stack<int> st;  // st存下标?
        st.push(0);
        for(int i = 1;i < nums.size()*2;i++){
            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;
    }
};

接雨水

leetcode:42. 接雨水

单调栈

代码实现

class Solution {
public:
/*
单调栈横向求解
自顶向下单调递增栈(找下一个更高柱子)
比较当前 遍历元素 和 栈顶元素
< 入栈
== 先出栈再入栈(去除重复元素避免后续重复计算)
> 进行雨水面积计算(横向):
    1. 记录当前栈顶为mid;弹出栈顶
    2. h = min(height[i],height[st.top()]) - height[mid];
    3. w = i - st.top() - 1;
    4. sum += h*w;
*/
    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.pop(); st.push(i);}
            else{
                while(!st.empty() && height[i] > height[st.top()]){
                    int mid = st.top(); st.pop();
                    if(!st.empty()){
                        int h = min(height[i],height[st.top()]) - height[mid];
                        int w = i - st.top() - 1;
                        sum += h*w;
                    }
                }
                st.push(i);
            }
            
        }

        return sum;
    }
};

精简版:

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++){
            while(!st.empty() && height[i] > height[st.top()]){
                int mid = st.top(); st.pop();
                if(!st.empty()){
                    int h = min(height[i],height[st.top()]) - height[mid];
                    int w = i - st.top() - 1;
                    sum += h*w;
                }
            }
            st.push(i); // 别忘了 三种情况下最后都要push
        }

        return sum;
    }
};

TS:

/**写个TS版本 */
function trap(height: number[]): number {
    const st:number[] = [];
    st.unshift(0);
    let sum:number = 0;
    for(let i = 1;i < height.length;i++){
        while(st.length !== 0 && height[i] > height[st[0]]){
            const mid:number = st.shift();
            if(st.length !== 0){
                const h:number = Math.min(height[i],height[st[0]]) - height[mid];
                const w:number = i - st[0] - 1;
                sum += h*w;
            }
        }
        st.unshift(i);
    }

    return sum;
};

标签:59,nums,int,top,雨水,height,60,st,size
From: https://www.cnblogs.com/tazdingo/p/18102149

相关文章

  • 听劝!24 选错 660/880/1000的人,已经二战了
    25考研的备考形势,势必跟以前不一样了。24考完,大家都发现,没有一本习题册,覆盖了考试的所有知识点。主流的模拟卷,都没有达到24卷的难度。这就意味着:一本习题册不够了!刷主流模拟卷不够了!这会需要整个考研复习的安排,作一个很大的调整。如果你还在看24以前的学长规划,它就可能......
  • 旷场实验KT-0860——观察研究实验动物神经精神变化
    旷场是观察研究实验动物神经精神变化、进入开阔环境后的各种行为,例如动物对新开阔环境的恐惧而主要在周边区域活动,在中间区域活动较少,但动物的探究特性又促使其产生在中间区域活动的动机,也可观察由此而产生的焦虑心理。兴奋药可以明显增加自主的活动而减少探究行为,在统一些剂......
  • 孟子义GQ外拍特写159p-1.3G
    高清下载地址:孟子义GQ外拍特写159p-1.3G如果文件不显示,说明被和谐,为防止和谐,一定要转存到自己的网盘,然后打开查看importrandomall_choices=['石头','剪刀','布']computer=random.choice(all_choices)player=input('请出拳:')......
  • 以太网芯片的配置:VSC8601和YT8531
    使用以太网芯片你需要关心的:1.phyaddress;2.delay;目的:RX_CLK(atReceiver)是在RX_CLK(atTransmitter)的基础上相移90°左右而得,这样采集到的数据会更加稳定。3.resettime;VSC8601参考:https://cloud.tencent.com/developer/article/1614786MDIO配置时序:PHYaddress......
  • P1605 迷宫 (对坐标dfs)
    写在前面:        我可太牛了!第一次写就能得70分!信心倍增!        OMG!五分钟找出漏洞,我真是太棒啦!        这道题要注意,一定要将初始起点坐标状态设为true!题目:代码:#include<algorithm>#include<iostream>#include<cstring>#include<queue>#in......
  • MBR4060DC-ASEMI肖特基二极管MBR4060DC
    编辑:llMBR4060DC-ASEMI肖特基二极管MBR4060DC型号:MBR4060DC品牌:ASEMI封装:TO-263最大平均正向电流(IF):40A最大循环峰值反向电压(VRRM):60V最大正向电压(VF):0.85V工作温度:-65°C~150°C反向恢复时间:ns重量:1.38克芯片个数:2芯片尺寸:130mil正向浪涌电流(IFMS):300AMBR4060DC特性:耐......
  • ASAA821-EARB0-7H 金手指连接器 SMD卧贴 间距0.5MM 260P DDR4 FOXCONN(富士康)
    ASAA821-EARB0-7H衔接器主要用于电脑和其他电子产品中,完成电气衔接和信号传输。在实践运用中,它可能需要与相应的插座或其他衔接器配合运用。ASAA821-EARB0-7H是富士康(FOXCONN)企业集团出产的一款金手指连接器。以下是关于该产品的部分信息:品牌:FOXCONN/富士康型号:ASAA821-EAR......
  • LeetCodeHot100 链表 160. 相交链表 206. 反转链表 234. 回文链表 141. 环形链表
    160.相交链表https://leetcode.cn/problems/intersection-of-two-linked-lists/description/?envType=study-plan-v2&envId=top-100-likedpublicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){intlenA=0;intlenB=0;L......
  • 洛谷 P5937 [CEOI1999] Parity Game
    题意:区间长度为n,m个查询。每次查询给出区间与一个数值0或者1,代表区间内的1的个数。找出不矛盾的最后一个询问。思路:首先用到区间压缩,排序后去重即可。使用带权dsu,如果是同一个root,那么xor运算看是否符合输入。如果不是同一个root,直接合并。这里合并区间的时候权重更新有点抽象,xx......
  • 代码随想录算法训练营day35 | leetcode 860. 柠檬水找零、406. 根据身高重建队列、452
    目录题目链接:860.柠檬水找零-简单题目链接:406.根据身高重建队列-中等题目链接:452.用最少数量的箭引爆气球-中等题目链接:860.柠檬水找零-简单题目描述:在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一......