題目:
給定乙個不含重複數值的陣列,找到每乙個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 這裡一定要注意所說的遞增遞減指的是出棧...