面試題 利用棧尋找下乙個較大元素

2021-09-25 10:46:14 字數 954 閱讀 8319

給出乙個陣列,向右尋找每乙個元素的下乙個較大的元素,沒有更大的則為-1

舉例{4,6,1,3,2,5}

則求得的答案應為

{6,-1,3,5,5,-1}

參考:不能暴力破解,且需要用o(n)的方法來實現。

本題需要用到棧來解決。我們宣告乙個陣列,用來存放每個元素對應的結果值。

我們從頭往後遍歷陣列元素值,

只要新來的元素比棧頂元素的大,我們就對棧頂元素的ret值進行更新,並將棧頂該元素彈出。(不斷迴圈判斷,直到新來的元素值小於棧頂元素),所以此處需要乙個while來實現。

否則(新來的元素比棧頂元素小),則壓入新來的這個元素到棧頂。

另外,因為我們更新棧頂元素的ret值的時候需要用它對應的下標去更新,所以我們在壓棧的時候不壓入元素值,而是壓入當前元素在陣列中對應的id值。

下圖模擬了整個判斷的流程:

延伸:如何利用棧:

之前是利用棧去求當前棧的最小值,這裡是求下乙個最大值。

問題本身可能有區別,但是有一些共性那就是,所要求的資料都是變長的,而所要求的資料都是以一種遞增或者遞減的順序排列著,中間夾雜這別的元素。

而棧在這裡起的作用就是:

1、儲存了這種遞增或者遞減的次序。2、即使有新的元素加入就能通過出棧或者入棧來維護需要的答案。

所以,之後,在實際中,如果遇到一些變化長度的資料,但是資料的次序不發生改變,這種時候我們就可以使用棧,來輔助存放資料,來儲存資料和求得結果。

private int nextmax(int nums)

//當前元素已小於棧頂元素,則入棧

s.push(i);

} return ret;

}

下乙個較大元素

現在我們有乙個int陣列,請你找出陣列中每個元素的下乙個比它大的元素。給定乙個int陣列a及陣列的大小n,請返回乙個int陣列,代表每個元素比他大的下乙個元素,若不存在則為 1。保證陣列中元素均為正整數。測試樣例 11,13,10,5,12,21,3 7返回 13,21,12,12,21,1,1 思...

下乙個較大元素

題目描述 現在我們有乙個int陣列,請你找出陣列中每個元素的下乙個比它大的元素。給定乙個int陣列a及陣列的大小n,請返回乙個int陣列,代表每個元素比他大的下乙個元素,若不存在則為 1。保證陣列中元素均為正整數。測試樣例 11,13,10,5,12,21,3 7 返回 13,21,12,12,21...

CTCI 下乙個較大元素

下乙個較大元素 題目描述 現在我們有乙個int陣列,請你找出陣列中每個元素的下乙個比它大的元素。給定乙個int陣列a及陣列的大小n,請返回乙個int陣列,代表每個元素比他大的下乙個元素,若不存在則為 1。保證陣列中元素均為正整數。測試樣例 11,13,10,5,12,21,3 7返回 13,21,1...