解法一:暴力解法
class Solution {public int[] dailyTemperatures(int[] temperatures) {int n=temperatures.length; // 指向要找下一個更高溫度的地方int[] result = new int[n];for(int left=0;left<n;left++){int right=left+1; // 指向正在找最高溫度的地方while(right<n){if(temperatures[left]<temperatures[right]){result[left]=right-left;break;}else{right++;}}}return result;}
}
錯誤原因:
解法二:單調棧
-
當 i=0 時,單調棧為空,因此將 0 進棧。
-
stack=[0(73)]
-
ans=[0,0,0,0,0,0,0,0]
-
-
當 i=1 時,由于 74 大于 73,因此移除棧頂元素 0,賦值 ans[0]:=1?0,將 1 進棧。
-
stack=[1(74)]
-
ans=[1,0,0,0,0,0,0,0]
-
-
當 i=2 時,由于 75 大于 74,因此移除棧頂元素 1,賦值 ans[1]:=2?1,將 2 進棧。
-
stack=[2(75)]
-
ans=[1,1,0,0,0,0,0,0]
-
-
當 i=3 時,由于 71 小于 75,因此將 3 進棧。
-
stack=[2(75),3(71)]
-
ans=[1,1,0,0,0,0,0,0]
-
-
當 i=4 時,由于 69 小于 71,因此將 4 進棧。
-
stack=[2(75),3(71),4(69)]
-
ans=[1,1,0,0,0,0,0,0]
-
-
當 i=5 時,由于 72 大于 69 和 71,因此依次移除棧頂元素 4 和 3,賦值 ans[4]:=5?4 和 ans[3]:=5?3,將 5 進棧。
-
stack=[2(75),5(72)]
-
ans=[1,1,0,2,1,0,0,0]
-
-
當 i=6 時,由于 76 大于 72 和 75,因此依次移除棧頂元素 5 和 2,賦值 ans[5]:=6?5 和 ans[2]:=6?2,將 6 進棧。
-
stack=[6(76)]
-
ans=[1,1,4,2,1,1,0,0]
-
-
當 i=7 時,由于 73 小于 76,因此將 7 進棧。
-
stack=[6(76),7(73)]
-
ans=[1,1,4,2,1,1,0,0]
-
class Solution {public int[] dailyTemperatures(int[] temperatures) {int n = temperatures.length; // 指向要找下一個更高溫度的地方int[] result = new int[n];Deque<Integer> stack = new LinkedList<>();for (int i = 0; i < n; i++) {while(!stack.isEmpty() && temperatures[i]>temperatures[stack.peek()]){int temp = stack.pop();result[temp] = i-temp;}stack.push(i);}return result;}
}