386,鍊錶中的下乙個更大節點

2021-10-09 17:53:07 字數 3737 閱讀 6708

給乙個鍊錶,返回每個節點下乙個比他大的值,如果不存在就返回0 。

示例 1:

輸入:[2,1,5]

輸出:[5,5,0]

示例 2:

輸入:[2,7,4,3,5]

輸出:[7,0,5,5,0]

示例 3:

輸入:[1,7,5,1,9,2,5,1]

輸出:[7,9,9,9,0,5,0,0]

問題分析這題和382,每日溫度的5種解題思路很像,不過有點不同的是第382題求的是下乙個比他大的數的位置和當前數字置的差值,而這裡求的是下乙個比他大的數的值。還有一點是382題使用的是陣列,我們這道題使用的是鍊錶。

所以我們完全可以參照382題的做法,由於鍊錶訪問比較麻煩,需要從前往後乙個個遍歷,我們這裡直接把鍊錶轉化為list集合的方式來求解。我們不把鍊錶轉為陣列,因為陣列需要先宣告大小,而鍊錶的大小我們是不知道的(如果先計算鍊錶的長度再轉化為陣列感覺有點多餘),我們直接把鍊錶轉化為list集合,這樣會更方便些。解題思路完全可以參照第382題,我們來看下**

暴力求解

public

int[

]nextlargernodes

(listnode head)

int[

] res =

newint

[list.

size()

];for(

int i =

0; i < list.

size()

-1; i++)}

}return res;

}

使用棧求解

public

int[

]nextlargernodes

(listnode head)

//棧中儲存的是元素的下標,並且從棧底到棧頂元素在集合中對應的

//值是從大到小的

stack

stack =

newstack

<

>()

;int

res =

newint

[list.

size()

];for(

int i =

0; i < list.

size()

; i++

) stack.

push

(i);

}return res;

}

剪枝計算

這種是從後往前計算,通過剪枝,減少運算

public

int[

]nextlargernodes

(listnode head)

int[

] res =

newint

[list.

size()

];for(

int i = res.length -

1; i >=

0; i--

)else

if(num ==0)

else}}

return res;

}

不轉化為list集合求解上面3種解法我們完全是參照第382題的答案寫的,並且在計算之前都首先把鍊錶轉化為list集合,我們能不能直接使用鍊錶,不把他轉化為list集合呢,其實也是可以的,我們只需要使用乙個棧來儲存鍊錶中每個節點在list中的位置即可,並且棧中元素在集合list中對應的值從棧底到棧頂是遞減的,原理還是和上面類似,我們就以上面例二的資料[2,7,4,3,5]來畫個圖看一下是怎麼樣的乙個實現過程

我們來看下**

public

int[

]nextlargernodes

(listnode head)

stack.

push

(list.

size()

);list.

add(node.val);}

for(

int i : stack)

int[

] res =

newint

[list.

size()

];for(

int i =

0; i < res.length; i++

)return res;

}

上面**核心部分在4-10行,原理和前幾種寫法類似,14-17行是把list轉化為陣列,第11-13行遍歷這個棧,這個時候棧中的每個元素在list中對應的值在後面沒有比他更大的,我們直接讓他等於0即可。

遞迴方式

當然我們還可以改為遞迴的方式,有興趣的可以自己看下

int

res;

public

int[

]nextlargernodes

(listnode head)

public

void

calnode

(listnode node,

int index, stack

stack)

calnode

(node.next, index +

1, stack)

;while

(!stack.

empty()

&& stack.

peek()

<= node.val)

stack.

pop();

res[index]

= stack.

empty()

?0: stack.

peek()

; stack.

push

(node.val)

;}

注意這裡的第14行如果棧頂元素不小於當前值就要出棧,一直到棧頂元素大於當前值為止,為什麼要這樣寫,因為這裡的遞迴對鍊錶的訪問實際上相當於從鍊錶的尾到頭開始的,也就是逆序。這個可以參照前面的剪枝計算,因為他也在集合中從後往前開始計算的。

鍊錶中的下乙個更大節點

給出乙個以頭節點 head 作為第乙個節點的鍊錶。鍊錶中的節點分別編號為 node 1,node 2,node 3,每個節點都可能有下乙個更大值 next larger value 對於 node i,如果其 next larger node i 是 node j.val,那麼就有 j i 且 no...

鍊錶中的下乙個更大節點

給出乙個以頭節點 head 作為第乙個節點的鍊錶。鍊錶中的節點分別編號為 node 1,node 2,node 3,每個節點都可能有下乙個更大值 next larger value 對於 node i,如果其 next larger node i 是 node j.val,那麼就有 j i 且 no...

1019 鍊錶中的下乙個更大節點

題目描述 給出乙個以頭節點 head 作為第乙個節點的鍊錶。鍊錶中的節點分別編號為 node 1,node 2,node 3,每個節點都可能有下乙個更大值 next larger value 對於 node i,如果其 next larger node i 是 node j.val,那麼就有 j i...