栈练习--------(LeetCode 739-每日温度)

题目:点这里

解法

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> ans;
        vector<int> stc;
        for(int i=0;i<temperatures.size();i++){
            ans.push_back(0);
        }
        for(int i=0;i<temperatures.size();i++){
            while(stc.size()&&temperatures[stc.back()]<temperatures[i]){
                ans[stc.back()] = i-stc.back();
                stc.pop_back();    
            }   
            stc.push_back(i);
        }
        return ans; 
    }
};

这个题目我又一次被栈这个容器的神奇所深深吸引,栈这个容器真是太有魅力了,同样的一道题目,用循环需要双层嵌套,代码又长又臭,而且会超时,用栈的话巧妙解决这个问题。

具体思路就是,首先定义两个栈,一个用来存放最终的答案,一个用来暂存需要比较元素的索引,第一步咱们将答案栈的所有值赋值为0,然后利用for循环的遍历,先将第一个元素,暂存入stc栈中,然后将温度数组中的后续元素与之比较,如若大于,则将两元素索引差传入答案栈,并且弹出stc栈的栈顶元素,否则将其传入stc栈中,紧接着进入下一层循环,再将stc栈的栈顶元素与后续元素进行比较,与前面重复相同的操作。

图示

但我学到的不只有这些。。。

反思

首先这一大段复杂的难以理解的代码不是一气呵成的,它需要我们结合图像分析,并生成初步的,不完善的一次性代码,后续再进行优化,比如:如果if语句和对应的else语句中都存在相同的语句,则就可以把这个重复语句提出来,放在判断的外面 ,另外,我总感觉栈配合循环 能爆发出无限的潜能,但我现在还不能想像出来,但这个题目给了我一点启发,栈配合循环使用的情形,如果一开始想象不到,可以把栈当作一个缓存的变量使用,结合判断,先写执行一次的特殊性代码,然后再转化成普遍性代码,这个就是从个性到共性,从特殊性到普遍性的道理。

还有,

ret.push_back()代表从尾部插入即入栈

ret.back()代表返回尾部元素即返回栈顶元素

ret.pop_back()代表删除尾部元素即出栈

相关推荐
Tisfy18 分钟前
LeetCode 0301.删除无效的括号:二进制枚举 / 回溯
算法·leetcode·字符串·题解·回溯·括号匹配·二进制枚举
Nil20826 分钟前
leetcode 322零钱兑换
算法·leetcode·职场和发展
海绵宝宝转agent31 分钟前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
yi01141 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
木井巳42 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
Logic1011 小时前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
扶风ff1 小时前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
程序员老陆1 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
yi0111 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
-dzk-1 小时前
【多维动态规划】LC 1143.最长公共子序列
算法·动态规划