Leetcode 503.下一個更大元素
阿新 • • 發佈:2019-02-14
code col 長度 imp 搜索 說明 i++ 映射 遍歷
下一個更大元素
給定一個循環數組(最後一個元素的下一個元素是數組的第一個元素),輸出每個元素的下一個更大元素。數字 x 的下一個更大的元素是按數組遍歷順序,這個數字之後的第一個比它更大的數,這意味著你應該循環地搜索它的下一個更大的數。如果不存在,則輸出 -1。
示例 1:
輸入: [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數;
第二個 1 的下一個最大的數需要循環搜索,結果也是 2。
註意: 輸入數組的長度不會超過 10000。
思路
使用棧來進行優化上面的算法,我們遍歷兩倍的數組,然後還是坐標i對n取余,取出數字,如果此時棧不為空,且棧頂元素小於當前數字,說明當前數字就是棧頂元素的右邊第一個較大數,那麽建立二者的映射,並且去除當前棧頂元素,最後如果i小於n,則把i壓入棧。因為res的長度必須是n,超過n的部分我們只是為了給之前棧中的數字找較大值,所以不能壓入棧,參見代碼如下:
1 import java.util.Arrays; 2 import java.util.Stack; 3 4 class Solution { 5 public int[] nextGreaterElements(int[] nums) { 6 int n=nums.length; 7 int[] res=new int[nums.length]; 8 Arrays.fill(res,-1); 9 Stack<Integer> stack=new Stack<Integer>();10 for(int i=0;i<2*n;i++){ 11 int num=nums[i%n]; 12 while(!stack.isEmpty()&&nums[stack.peek()]<num){ 13 res[stack.peek()]=num; 14 stack.pop(); 15 } 16 if(i<n) stack.push(i); 17 } 18 returnres; 19 } 20 }
Leetcode 503.下一個更大元素