給定乙個迴圈陣列(最後乙個元素的下乙個元素是陣列的第乙個元素),輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 -1。
建立乙個棧,來儲存下標值,我們用max_index來記錄最大元素第一次出現的下標。
遍歷陣列,當前元素(nums[i])大於nums[棧頂],那麼不斷出棧(直到nums[棧頂]不小於當前元素nums[i]),出棧元素表示的數的下乙個更大的元素即為當前遍歷的元素(即:nums[pop()]=nums[i])。【這樣每次出棧元素表示的數(nums[pop()])總是遞增的】
遍歷結束後,不在棧中的索引值,都找到了下乙個最大的元素,棧肯定不空(至少包含最大元素的下標)。
於是我們要將棧中剩下的數也要解決掉,棧中由頂至底所對應陣列中的數是遞增的,那麼通過比較nums[max_index]和nums[棧頂],可以將棧中非最大索引給解決掉。
那麼棧中剩下的就是最大元素的索引,它們表示的數的下乙個更大元素不存在。
class
solution
st_index.
push
(i);
if(nums[i]
>nums[max_index]
) max_index=i;
}while
(nums[max_index]
>nums[st_index.
peek()
])}}
while
(!st_index.
isempty()
) ans[st_index.
pop()]
=-1;
return ans;
}}
[1,
8,-1
,-100,-1
,222
,1111111,-
111111
]注意,出棧的同時,res[
pop(stack[-1
])]= nums[i]
i 棧 res 0[
][-1
,-1,
-1,-
1,-1
,-1,
-1,-
1]1[
0][-
1,-1
,-1,
-1,-
1,-1
,-1,
-1]0出棧,1入棧2[
1][8
,-1,
-1,-
1,-1
,-1,
-1,-
1]2入棧3[1
,2,3
][8,
-1,-
1,-1
,-1,
-1,-
1,-1
]3入棧4[
1,2,
4][8
,-1,
-1,-
1,-1
,-1,
-1,-
1]3出棧,4入棧5[
5][8
,-1,
-1,-
1,-1
,-1,
-1,-
1]1,
2,4出棧,5入棧6[
6][8
,222
,222,-
1,222,-1
,-1,
-1]5出棧,6入棧7[
6,7][8
,222
,222,-
1,222,
1111111,-
1,-1
]7入棧8-
>0[
6][8
,222
,222,-
1,222,
1111111,-
1,-1
]7出棧9-
>1[
6][8
,222
,222,-
1,222,
1111111,-
1,1] 無變化10-
>2[
6][8
,222
,222,-
1,222,
1111111,-
1,1] 無變化11-
>3[
6][8
,222
,222,-
1,222,
1111111,-
1,1] 無變化12-
>4[
6][8
,222
,222,-
1,222,
1111111,-
1,1] 無變化13-
>5[
6][8
,222
,222,-
1,222,
1111111,-
1,1] 無變化
變式:如果陣列不是乙個迴圈陣列應該怎麼做?
很簡單,維護乙個單調棧,棧中存放的是陣列中的元素值,我們從後往前開始遍歷陣列,利用這個單調棧來得到結果。具體操作是,如果當前位置的值比棧頂的大,就開始彈棧,直到:
棧為空。(說明當前位置沒有下乙個更大的值了)
棧頂值大於當前位置的值。(棧頂的值就是下乙個更大的值)
最後把當前位置的值加入棧中。
而現在是乙個迴圈陣列,問題複雜了一點。如果我們直接從後往前開始遍歷陣列,就無法得到正確的結果,因為在棧彈空的時候,不一定說明沒有下乙個更大的值(當前位置之前的值其實有可能是下乙個更大的值)。
乙個簡單的解決方法是,我們在遍歷之前,先把陣列中的值全部填充到棧中,從後往前填充,也就是棧頂放的是第乙個元素,棧底放的是最後乙個元素。
class
solution
// 結果陣列
int[
] res =
newint
[len]
; deque
stack =
newlinkedlist
<
>()
;// 首先,從末尾開始把數字推入棧中
for(
int i = len -
1; i >=
0; i--
)// 再次從末尾開始遍歷nums陣列
for(
int i = len -
1; i >=
0; i--
)// 如果棧被彈空了,說明當前值是陣列中的最大值,res[i] = -1,如果棧沒有空,則棧頂值就是下乙個更大的值
if(stack.
isempty()
)else
// 將當前位置的值入棧
stack.
push
(val);}
return res;
}}
leetcode503 下乙個更大的元素
難度 中等 題目 給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,...
LeetCode 503 下乙個更大元素II
給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...
Leetcode 503 下乙個更大元素II
給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...