leetcode 739 解法思路

题目描述

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

解题思路

这个题目可以看做是从左往右找第一个比这个数大(或者小)的数的位置,然后求出下标只差就可以了。说是很容易,但是如果做的话,最暴力的方法:我们求第i位置的时候,从该位置开始找到右边第一个比这个数大的数的位置时结束本次遍历。一次类推,这样下来的时间复杂度是O(n^2).这种简单暴力的方法应该都能够想出来。用单调栈的方法能够以O(n)的时间复杂度完成本次操作:

我们设置一个栈,其中要求这个栈从栈底到栈顶是单调递减的。我们在入栈的时候不进行任何操作,当不满足单调栈的从栈底到栈顶由大变小的规则时,我们就需要将栈顶元素弹出,在弹出时我们才进行相关操作,也就是说,只有栈需要弹出时才能激发操作。这个操作就是“终于遇到了比栈顶元素大的右边第一个数了”,这时候我们就记录这个位置比栈顶元素所在的位置大多少(下标差),只要一直不满足这个单调栈的规定,就一直弹出,一直记录结果,最后遍历完毕整个数组,剩下的栈内元素都是那些右边不存在比该位置更大的数了,所以直接填写0即可。

整个过程可以按照以下的伪代码执行:

对于T[i]:    i:0~(length-1){

  if(stack为空 || T[i]<=栈顶元素){

  将T[i]压入栈;

  continue;

  }

while(栈不为空&&T[i]大于栈顶元素的值){

    result【栈顶元素的下标】 = i(当前元素的下标) -  栈顶元素的下标;
                弹出栈顶元素;
            }
            while(栈顶元素非空){
            result[栈顶元素下标] = 0;

弹出栈顶元素。
        }

}

下面是代码:Leetcode-739 每日温度(git)Leetcode-739

 

vector<int> dailyTemperatures(vector<int>& T) {
        stack<pair<int,int>> st;
        int size = T.size();
        vector<int> res(size,0);
        if(size<=1) return res;
        for(int i=0;i<T.size();i++){
            if(st.empty() || T[i]<=st.top().first){
                st.push(make_pair(T[i],i));
                continue;
            }
            while(!st.empty()&&T[i]>st.top().first){        //遇到比栈的头结点大的就全部进行弹出,只有在弹出数据的时候往结果数据集合填充数据。
                res[st.top().second] = i - st.top().second;
                st.pop();
            }
            st.push(make_pair(T[i],i));
        }
        while(!st.empty()){
            res[st.top().second]=0;
            st.pop();
        }
        return res;
}

 

发布了28 篇原创文章 · 获赞 15 · 访问量 8266

猜你喜欢

转载自blog.csdn.net/weixin_38976558/article/details/97527617