Leetcode503 下乙個更大元素 II 題解

2021-10-21 07:24:09 字數 3504 閱讀 3875

給定乙個迴圈陣列(最後乙個元素的下乙個元素是陣列的第乙個元素),輸出每個元素的下乙個更大元素。數字 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 解釋 第乙個 ...