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

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

文章目录

    • 503.下一个更大元素II
      • 思路
      • 代码实现
    • 42. 接雨水
      • 思路
      • 代码实现


503.下一个更大元素II

题目链接

思路

这道题和下一个更大元素 I的不同之处在于这个查找是循环的。
循环直接可以用查找两次来解决,所以题目步骤唯一不同的就是循环的终止位置。

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());
}

代码实现

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        stack<int> st;
        vector<int> result(nums.size(),-1);
        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;
    }
};

42. 接雨水

题目链接

思路

这道题直接变成困难题,愿意就是前面的题目都是找一边的最大值,而这道题是找两边的最大值。其实意识到这一点,这道题也没那么难了。
已经知道单调栈储存的元素是从栈头到栈底单调递增的元素。在遍历元素Height[i]和st.top()相比较时,会出现三种情况:

  1. Height[i] 大于 Height[st.top()]
  2. Height[i] 等于 Height[st.top()]
  3. Height[i] 小于 Height[st.top()]

情况2和情况3和之前操作一样,先把元素放入栈内保存着,遍历寻找下一个比它大的元素。
而情况1表明找到了st.top()前比它大的元素位置,而st.top()后比他大的元素位置就是它在栈内位置的下方元素,那么这道题就迎刃而解了,困难题也没有那么“困难”。

代码实现

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        int right;
        int left;
        int mid;
        int result=0;
        st.push(0);
        for(int i=1;i<height.size();i++){
            while(!st.empty()&&height[st.top()]<height[i]){
                right=i;
                mid=st.top();
                st.pop();
                if(st.empty())break;
                else left=st.top();
                result+=(right-left-1)*(min(height[right],height[left])-height[mid]);
            }
            st.push(i);
        }
        return result;
    }
}


http://www.kler.cn/a/152478.html

相关文章:

  • 全栈软件开发工程师需要具备哪些技能
  • ElementPlus自定义表单验证
  • 删除容器挂载卷打包容器镜像并传到阿里云
  • c++--类型的基础
  • 43.0BaseDao抽取dao公共父类
  • 大数据(十一):概率统计基础
  • STM32/GD32_分散加载
  • Paraformer 语音识别原理
  • Android Audio实战——音频焦点监听(十)
  • 从薛定谔的猫——量子理论基础
  • 设计模式详解(二):抽象工厂——Abstract Factory
  • JavaEE——简单认识CSS
  • oracle impdp 导入元数据表空间异常增大的解决办法
  • 党建引领·和谐共建——赤岗街首届微型社区养老服务公益博览会开幕
  • (2)(2.2) Lightware SF45/B(350度)
  • 2的幂运算
  • IC修真院 | 芯片嵌入式课程重磅上线!
  • 中伟视界:AI盒子中的报警预录像功能能解决什么问题?实现原理是怎样的?
  • 关于微信小程序中如何实现数据可视化-echarts动态渲染
  • java21虚拟线程