leetcode基础算法 栈篇 :每日温度(Daily temperatures)

Daily temperatures

Given a list of daily temperatures, produce a list that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.

For example, given the list temperatures = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0].

Note: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100].

题目描述:给你每天的温度,计算下一个温度更高的日子距当前的天数。(题目要求栈实现)

 

解题过程的问题:一开始迷糊了蛮长时间,现在一想都不知道当时在想什么,很简单的题想的太麻烦,说明我的在做题的时候脑子里还不是很专注,很清晰。分析解题思路的过程对编程是一个很重要的过程,是既快速又高效解出一道题的前提,我以后要在解体前专注思想,让大脑能更清楚的分析题目。

 

思路:

创建answer数组保存计算的结果值,容量=temperatures.size() 初始值都设为0(0为没有找到“更温暖的一天”)

创建一个栈s来储存那些还未找到“更温暖一天”的值,栈顶的元素一定是最近遍历的且未找到“更温暖一天“的,

例:99 72 72 73 100

所以遍历数组temperatures

如果栈空,把当前元素压入

 tempera数组  →99 72 72 73 100          stack s:99           

到下一个元素时也就是72时  

tempera[i]    99 →72 72 73 100   

此时栈非空  ,将它(72)和栈顶元素比较  72<99  不是栈内元素“更温暖的一天“ 所以压入栈

stack s: 72 99

下一个同理 72=72 压入栈中

stack s: 72 72 99

tempera[i] :99 72 72 →73 100

73>72  是72“更温暖的一天”  所以计算他们之间相差的天数,再存入到answer数组的相应位置上,把栈顶的72 排出 s.pop

answer[0,0,1,0,0], stack s:72 99

此时继续将temperatures[i]同栈顶元素比较,73>72所以重复操作,计算差值存入answer,s.pop

answer [0,2,1,0,0] ,  stack s:99

再比较temperatures[i]和栈顶元素   73<99,所以把73压入栈(因为它不比栈里面的元素大)跳出循环,继续遍历数组temperatures

temperatures:99 72 72 73 →100 ,stack s:73 99

比较100>73 ,计算差值,存入anwer,再比较栈顶元素100>99,同样操作:

stack s:空   answer:4 2 1 1 0

数组遍历到头,计算完成,return ans; 程序结束。

贴上代码(才开始尝试写英文注释,应该有不少错误,发现后改正)

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        stacks;
        vectorans(temperatures.size(),0);
        for(int i=0;is.top())          //if the figure was found ,find the latest element whose value is 0 from array [ans]
            {                                    //this element is the latest one =0;j--)
                    {
                        if(ans[j]==0)
                        {
                            ans[j]=i-j;
                            break;
                        } 
                    }
                    s.pop();
                }
                s.push(temperatures[i]);
            }
        else
                       {
                           s.push(temperatures[i]);
                       }
    }
                      
    return ans;
    }
};

 

在leetcode上提交的结果:

运行时间花费属于后百分之40.。。。

看大佬们的提交,最多的也比较高效的是运用了HASH哈希表,由于我还没看到哈希表的部分暂时就不去琢磨了。

前30%~60%的提交就是在栈里存i,也就是天数就行了,到时候一减就ok,我觉得这就应该是普通解了,最正常的解。我一开始理解错题意了,以为答案数组要存的是和最近相差的温度,不然也应该这样写,我改正下:

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        int n=temperatures.size();
        stacks;
        vectorans(n,0);
        
        for(int i=0;itemperatures[s.top()]) 
                {
                   ans[s.top()]=i-s.top();
                    s.pop();
                }
            
                s.push(i);
            }
    
                      
    return ans;
    }
};

速度快多了,也简洁多了!

leetcode基础算法 栈篇 :每日温度(Daily temperatures)_第1张图片

果然一个写一个好的程序需要清晰的思路和不断迭代啊!!!啊。

等学到哈希把哈希的代码写在下面:

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(leetcode基础算法)