zoukankan      html  css  js  c++  java
  • 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;
        }
        
        };
  • 相关阅读:
    将数据加载到内存中
    反射,Java开发者必须跨越的坎
    Eclipse中Java文件图标由实心J变成空心J的问题
    Maven项目 解决cannot be read or is not a valid ZIP file问题
    MyEclipse中SVN
    常用的 正则验证等
    前台传递数组后台通过json字符串承接和处理
    img标签图片与图片背景的区别和使用场景
    数据库的特性和事务的特性
    redis在EOS7上面进行开启和停止的命令
  • 原文地址:https://www.cnblogs.com/renzmin/p/11920589.html
Copyright © 2011-2022 走看看