單調棧結構

2021-10-05 02:58:59 字數 893 閱讀 2914

題目:

給定乙個不含重複數值的陣列,找到每乙個i位置左右兩邊第乙個比arr[i]小的值的下標。如果不存在則下標為-1

解暴力解:時間複雜度為n^2

高階:使用單點棧結構,時間複雜度為 o(n)

單調棧找小的,棧底放較小值;找大的棧底放較大值。

如題,找相鄰最近較小,所以棧底到棧頂公升序。

遍歷陣列,如果棧為空,直接入棧,如果當前元素大於棧頂元素,入棧。

如果當前元素小於棧頂元素,說明此元素是棧頂元素右側第乙個小於它的元素,而棧頂元素左側第乙個小於它的則是棧中棧頂下面的那乙個元素。這樣就可以確定棧頂的左右兩側目標點,然後出棧,用棧頂繼續與此元素比較,重複以上過程。

如過遍歷了整個陣列,且棧不為空棧頂右側為-1,棧底左側為-1

如果兩個元素相同,則在棧頂中記錄,使用鍊錶在後面追加

vectorint>>

getnearless

(vector<

int>obj);}

stackint>>help;

for(

int i =

0; i < obj.

size()

; i++)}

//相等 在棧底元素後面追加iif(

!help.

empty()

&& obj[help.

top().

back()

]== obj[i]

) help.

top().

push_back

(i);

else

}while

(!help.

empty()

)//陣列遍歷結束,棧不為空

}return ret;

}

單調棧結構

單調棧結構 給定乙個不含有重複值的陣列 arr,找到每乙個 i 位置左邊和右邊離 i 位置最近且值比 arr i 小的位置。返回所有位置相應的資訊。輸入描述 第一行輸入乙個數字 n,表示陣列 arr 的長度。以下一行輸出 n個數字,表示陣列的值。輸出描述 輸出n行,每行兩個數字 l 和 r,如果不存...

單調棧結構及其應用

單調棧 解決乙個陣列中,對於每個數,求左邊離它最近的比它大 小 的數,右邊離它最近的比它大 小 的數,時間複雜度o n 實現。1.乙個陣列可化為乙個直方圖,陣列內數值代表該位置的高度 邊長為1的小正方形的個數 求這個直方圖可以形成的最大矩形面積 即小正方形個數 int maxrecfrombotto...

資料結構 單調棧

上班無事,刷力扣發現了個新名詞 單調棧 題目 496.下乙個更大元素 i 名字上就聽的出來,單調棧中存放的資料應該是有序的,所以單調棧也分為單調遞增棧和單調遞減棧 單調遞增棧 棧中資料出棧的序列為單調遞增序列 單調遞減棧 棧中資料出棧的序列為單調遞減序列 ps 這裡一定要注意所說的遞增遞減指的是出棧...