給定一個循環數組(最后一個元素的下一個元素是數組的第一個元素),輸出每個元素的下一個更大元素。數字 x 的下一個更大的元素是按數組遍歷順序,這個數字之后的第一個比它更大的數,這意味著你應該循環地搜索它的下一個更大的數。如果不存在,則輸出 -1。
示例 1:
輸入: [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數;
第二個 1 的下一個最大的數需要循環搜索,結果也是 2。
注意: 輸入數組的長度不會超過 10000。
解題思路
維護一個單調遞增的棧,因為是從左到右進行遍歷的,所以越靠近棧頂的元素位置越接近當前元素,棧頂到棧底的單調遞增的,所以當只需要不斷出棧直到遇到比當前元素大的就是當前位置的結果,并且將當前元素進棧。
代碼
class Solution {public int[] nextGreaterElements(int[] nums) {int n=nums.length;Stack<Integer> stack=new Stack<>();int[] ints = new int[n];Arrays.fill(ints,-1);boolean[] booleans = new boolean[n];for (int i = n-1; i >=0; i--) {if(booleans[i]) continue;while (!stack.isEmpty()&&nums[i]>=stack.peek())//找出一個比當前元素大的stack.pop();if(!stack.isEmpty())//存在一個比當前元素大的,則加入結果并且標記為已找到{ints[i]=stack.peek(); booleans[i]=true;} stack.push(nums[i]);}for (int i = n-1; i >=0; i--) {//因為是循環數組,所以需要再計算一次if(booleans[i]) continue;while (!stack.isEmpty()&&nums[i]>=stack.peek())stack.pop();if(!stack.isEmpty()){ints[i]=stack.peek(); booleans[i]=true;}stack.push(nums[i]);}return ints;}
}