739. Daily Temperatures(C++ 和 Java解法)

本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode  Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。

解题思路一: 

双重循环,对每一天的温度遍历其后面的温度,直到找到符合要求的。时间复杂度O(n ^ 2)

class Solution {
    public int[] dailyTemperatures(int[] T) {
        int[] result = new int[T.length];
        for(int i = 0;i < T.length;i++){
            for(int j = i + 1;j < T.length;j++){
                if(T[j] > T[i]){
                    result[i] = j - i;
                    break;
                }
            }
        }
        return result;
    }
}

解题思路二: 

利用堆栈(stack),从右到左遍历。

栈底:一直都是最高温度的那天

栈顶:距离当前天数i最大温度的那天。栈顶stack.peek() - i得到的相隔天数。栈顶一直在变化。

具体可以画个栈看看流程。

java版本

class Solution {
    public int[] dailyTemperatures(int[] T) {
        int[] result = new int[T.length];
        Stack stack = new Stack<>();
        
        for (int i = T.length - 1; i >= 0; i--) {
            /*若栈非空且栈顶对应那天温度T[stack.peek()] 小于等于 当天i的温度T[i],则一直出栈,目的是找到比T[i]高的那天。若栈为空了,则T[i]是最高的温度*/
            while (!stack.isEmpty() && T[stack.peek()] <= T[i]) {
                stack.pop();
            }
            if (!stack.isEmpty()) {
                result[i] = stack.peek() - i;
            }
            stack.push(i);            //入栈
        }
        
        return result;
    }
}

c++版本

 vector dailyTemperatures(vector& T) {
        vector result(T.size(), 0);
        stack stack;
        
        for (int i = T.size() - 1; i >= 0; i--) {
            while (!stack.empty() && T[stack.top()] <= T[i]) {
                stack.pop();
            }
            if (!stack.empty()) {
                result[i] = stack.top() - i;
            }
            stack.push(i);
        }
        
        return result;
}

 

你可能感兴趣的:(leetcode,c++,stack,栈)