zoukankan      html  css  js  c++  java
  • [LeetCode] 739. Daily Temperatures 每日温度

    Given a list of daily temperatures T, return a list such 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 of temperatures T = [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].

    给一个每天温度的数组,对于每一天,找出下一个比当前温度大的元素,记录它们之间的天数。

    解法:栈,递减栈Descending Stack,新建一个长度和T相等的数组res,来记录天数。遍历数组,如果栈为空,直接如栈。如果栈不为空,且当前数字大于栈顶元素,pop出栈顶元素,求出下标差,也就是升温的天数,把这个差值记录给栈顶元素在res中的位置。然后继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止。然后将当前数字入栈。最后返回res。

    Java: Stack

    public int[] dailyTemperatures(int[] temperatures) {
        Stack<Integer> stack = new Stack<>();
        int[] ret = new int[temperatures.length];
        for(int i = 0; i < temperatures.length; i++) {
            while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
                int idx = stack.pop();
                ret[idx] = i - idx;
            }
            stack.push(i);
        }
        return ret;
    }
    

    Java: Array

    public int[] dailyTemperatures(int[] temperatures) {
        int[] stack = new int[temperatures.length];
        int top = -1;
        int[] ret = new int[temperatures.length];
        for(int i = 0; i < temperatures.length; i++) {
            while(top > -1 && temperatures[i] > temperatures[stack[top]]) {
                int idx = stack[top--];
                ret[idx] = i - idx;
            }
            stack[++top] = i;
        }
        return ret;
    } 

    Python:

    # Time:  O(n)
    # Space: O(n)
    
    class Solution(object):
        def dailyTemperatures(self, temperatures):
            """
            :type temperatures: List[int]
            :rtype: List[int]
            """
            result = [0] * len(temperatures)
            stk = []
            for i in xrange(len(temperatures)):
                while stk and 
                      temperatures[stk[-1]] < temperatures[i]:
                    idx = stk.pop()
                    result[idx] = i-idx
                stk.append(i)
            return result  

    Python: wo

    class Solution(object):
        def dailyTemperatures(self, T):
            """
            :type T: List[int]
            :rtype: List[int]
            """
            st = []
            res = [0] * len(T)
            for i in xrange(len(T)):
                if not st or T[i] <= T[st[-1]]:
                    st.append(i)
                else:
                    while st and T[i] > T[st[-1]]: 
                        j = st.pop()
                        res[j] = i - j
                    st.append(i)   
                                            
            return res  
    

    C++:

    // Time:  O(n)
    // Space: O(n)
    
    class Solution {
    public:
        vector<int> dailyTemperatures(vector<int>& temperatures) {
            vector<int> result(temperatures.size());
            stack<int> stk;
            for (int i = 0; i < temperatures.size(); ++i) {
                while (!stk.empty() &&
                       temperatures[stk.top()] < temperatures[i]) {
                    const auto idx = stk.top(); stk.pop();
                    result[idx] = i - idx;
                }
                stk.emplace(i);
            }
            return result; 
        }
    };
    

        

    类似题目:

    [LeetCode] 496. Next Greater Element I 下一个较大的元素 I

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9881122.html
Copyright © 2011-2022 走看看