• 代码随想录打卡第39天:单调栈


    1.单调栈

    1.什么是单调栈?

    单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

    2.单调栈一般解决什么问题?

    通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了时间复杂度为O(n)。

    3.单调栈需要考虑什么?

    1. 单调栈里存放的元素是什么?单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。
    2. 单调栈里元素是递增呢? 还是递减呢?

    4.单调栈需要判断的条件

    • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
    • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
    • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

    2.739每日温度

    1.解题思路

    由于题目中需要找到右边第一个比今天大的温度,与单调栈的思路相匹配,所以本题使用单调栈来解决问题。

    2.具体实现

    st存放的是顺序遍历时还未找到右边第一个比今天大的温度。

    ret存放的是对应的右边第一个比今天大的温度数组,默认情况下全为-1。

    • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况,没有找到右边的大于的元素,直接入栈
    • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况,没有找到右边的大于的元素,直接入栈
    • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况,找到了右边的大于的元素,出栈放到对应下标位置的ret,继续判断,直到遇到不大于的元素之后结束出栈操作,然后将当前值入栈
    • 由前面的可以看出,这个st存放的是一个单调递减的。
      1. while(!st.empty()&&temperatures[st.top()] < temperatures[i]){
      2. ret[st.top()] = i - st.top();
      3. //cout<<st.top()<<i-st.top()<<endl;
      4. st.pop();
      5. }
      6. st.push(i);

    3.具体代码

    1. class Solution {
    2. public:
    3. vector<int> dailyTemperatures(vector<int>& temperatures) {
    4. stack<int> st;//存放的是下标
    5. int n = temperatures.size();
    6. vector<int> ret(n,0);
    7. st.push(0);
    8. for(int i = 1;i<n;i++){
    9. //cout<<st.top()<<temperatures[st.top()]<<i-st.top()<<endl;
    10. if(temperatures[st.top()]>temperatures[i]){
    11. st.push(i);
    12. }else if(temperatures[st.top()]== temperatures[i]){
    13. st.push(i);
    14. }else{
    15. while(!st.empty()&&temperatures[st.top()] < temperatures[i]){
    16. ret[st.top()] = i - st.top();
    17. //cout<<st.top()<<i-st.top()<<endl;
    18. st.pop();
    19. }
    20. st.push(i);
    21. }
    22. }
    23. return ret;
    24. }
    25. };

  • 相关阅读:
    [论文评析]AdaptivePose: Human Parts as Adaptive Points,AAAI 2022
    docker部署Vaultwarden密码共享管理系统
    m3u8视频播放HTML
    计算机毕业设计选题推荐-房屋租赁系统-Java/Python项目实战
    语音合成(TTS)应用方案一二三
    一次搞定33种python机器学习回归算法!超级全!
    一段程序的穷途一生
    API学习总结
    python读写excel文件
    关于windows上运行bitsandbytes老是报错的(说cuda版本有问题)解决方案
  • 原文地址:https://blog.csdn.net/mooc666quq/article/details/139289696