LeetCode 739. Daily Temperatures

原题链接在这里:https://leetcode.com/problems/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].

题解:

Stack<Integer> stk里存index, 若当前temperature 更高, 就一直pop出来index, 计算天数差值保存.

最后stk中剩余的index说明这些位置上没有更加暖和的天气, 存0.

Time Complexity: O(n). n = T.length.

Space: O(n).

AC Java:

 1 class Solution {
 2     public int[] dailyTemperatures(int[] T) {
 3         if(T == null || T.length == 0){
 4             return T;
 5         }
 6         
 7         int len = T.length;
 8         int [] res = new int[len];
 9         Stack<Integer> stk = new Stack<Integer>();
10         for(int i = len-1; i>=0; i--){
11             while(!stk.isEmpty() && T[i]>=T[stk.peek()]){
12                 stk.pop();
13             }
14             
15             res[i] = stk.isEmpty() ? 0 : stk.peek()-i;
16             
17             stk.push(i);
18         }
19         
20         return res;
21     }
22 }

We could also iterate from left to right. Form a monotonic increasing stack.

When we hit a bigger number, for all the popped indices, we hit a warmer day now. 

Time Complexity: O(n). n = temperatures.size().

Space: O(n).

AC Java:

 1 class Solution {
 2     public int[] dailyTemperatures(int[] temperatures) {
 3         if(temperatures == null || temperatures.length == 0){
 4             return temperatures;
 5         }
 6 
 7         int n = temperatures.length;
 8         Stack<Integer> stk = new Stack<>();
 9         int [] res = new int[n];
10         for(int i = 0; i < n; i++){
11             while(!stk.isEmpty() && temperatures[stk.peek()] < temperatures[i]){
12                 int ind = stk.pop();
13                 res[ind] = i - ind;
14             }
15 
16             stk.push(i);
17         }
18         
19         return res;
20     }
21 }

AC C++:

 1 class Solution {
 2 public:
 3     vector<int> dailyTemperatures(vector<int>& temperatures) {
 4         int n = temperatures.size();
 5         vector<int> res(n, 0);
 6         stack<int> stk;
 7         for(int i = 0; i < n; i++){
 8             while(!stk.empty() && temperatures[stk.top()] < temperatures[i]){
 9                 int top = stk.top();
10                 stk.pop();
11                 res[top] = i - top;
12             }
13 
14             stk.push(i);
15         }
16 
17         return res;
18     }
19 };

AC Python:

 1 class Solution:
 2     def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
 3         n = len(temperatures)
 4         stk = []
 5         res = [0] * n
 6         for i in range(n):
 7             while stk and temperatures[stk[-1]] < temperatures[i]:
 8                 top = stk.pop()
 9                 res[top] = i - top
10             stk.append(i)
11         return res

类似Online Stock SpanNext Greater Element IMinimum Cost Tree From Leaf Values.

posted @ 2018-01-04 12:14  Dylan_Java_NYC  阅读(820)  评论(0编辑  收藏  举报