LeetCode 739 每日温度
Posted 任仁人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 739 每日温度相关的知识,希望对你有一定的参考价值。
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 每日温度的主要内容,如果未能解决你的问题,请参考以下文章