码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 739 每日温度

时间:2019-11-23 23:59:55      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:col   如何   哪些   tco   ack   有用   while   private   ret   

1。直接遍历 暴力求解

class Solution 
{
public:
    vector<int>dailyTemperatures(vector<int>& T)
    {
        vector<int>res(T.size(),0);
        for(int i=0;i<T.size();i++)
        {
            if(T[i]<=100 && T[i]>=30)
            {
                for(int j=i;j<T.size();j++)
                {  
                       if(T[j]>T[i])
                       {
                           res[i]=(j-i);
                           break;
                       }
                       //到了最后一个元素,但是还是没找到比T[i]大的
                }
            }
        }      
         return res;
    }
};

 

 

 

 

2 利用栈

我们需要找到比当前 T[i] 温度更高的位置,那么必须要记录哪些信息?
我们试着找到 T[0] 过后温度升高的位置。如果知道 T[10]=50,则 T[20]=50 是无效信息,因为 T[i] 在 T[20] 以前已经到达了 50。如果 t[20]=100 将是有用的信息,因为如果 t[0]=80,那么 T[20] 将有可能是它的下一个温度升高的位置,而 T[10] 则不可能是。
因此,我们需要记住一个索引的列表,索引代表的温度严格递增。我们可以利用栈来实现这样的效果。
算法:

我们用栈记录索引,满足 T[stack[-1]] < T[stack[-2]] < ...,其中 stack[-1] 是栈的顶部,stack[-2] 是从顶部开始的第二个元素,依此类推;我们将在处理每个 T[i] 时保持 stack[-1] > stack[-2] > ...。
我们通过当前温度和栈顶索引所代表的温度比较来找到温度升高的位置。
举个例子:我们反向遍历处理 t=[73,74,75,71,69,72,76,73] ,通过看栈元素的变化来理解是如何工作的。为了清楚 stack 只包含索引 i,但是将把 T[i] 的值写在旁边的括号中,例如 0 (73)。
当 i = 7,stack = [7 (73)]。ans[i] = 0。
当 i = 6,stack = [6 (76)]。ans[i] = 0。
当 i = 5,stack = [5 (72), 6 (76)]。ans[i] = 1。
当 i = 4,stack = [4 (69), 5 (72), 6 (76)]。ans[i] = 1。
当 i = 3,stack = [3 (71), 5 (72), 6 (76)]。ans[i] = 2。
当 i = 2,stack = [2 (75), 6 (76)]。ans[i] = 4。
当 i = 1,stack = [1 (74), 2 (75), 6 (76)]。ans[i] = 1。
当 i = 0,stack = [0 (73), 1 (74), 2 (75), 6 (76)]。ans[i] = 1。

class Solution{
private:
    
public:
    vector<int>dailyTemperatures(vector<int>& T)
    {
            vector<int>res(T.size(),0);
            stack<int>tempStack;
            
            for(int j=T.size()-1;j>=0;j--)
            {
                
                while(tempStack.size()!=0 && T[j]>=T[tempStack.top()])
                    tempStack.pop();
                if(tempStack.size()!=0) res[j]=tempStack.top()-j;
                tempStack.push(j);
            }
            return res;
    }
    
    };

 

LeetCode 739 每日温度

标签:col   如何   哪些   tco   ack   有用   while   private   ret   

原文地址:https://www.cnblogs.com/renzmin/p/11920589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!