給乙個鍊錶,返回每個節點下乙個比他大的值,如果不存在就返回0 。
示例 1:
輸入:[2,1,5]示例 2:輸出:[5,5,0]
輸入:[2,7,4,3,5]示例 3:輸出:[7,0,5,5,0]
輸入:[1,7,5,1,9,2,5,1]問題分析這題和382,每日溫度的5種解題思路很像,不過有點不同的是第382題求的是下乙個比他大的數的位置和當前數字置的差值,而這裡求的是下乙個比他大的數的值。還有一點是382題使用的是陣列,我們這道題使用的是鍊錶。輸出:[7,9,9,9,0,5,0,0]
所以我們完全可以參照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...