給出乙個陣列,向右尋找每乙個元素的下乙個較大的元素,沒有更大的則為-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...