1. 程式人生 > >Leetcode 503.下一個更大元素

Leetcode 503.下一個更大元素

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 return
res; 19 } 20 }

Leetcode 503.下一個更大元素