乙個含有重複值的陣列arr,找到每乙個i位置左邊和右邊離i位置最近且值比arr[i]小的位置,返回所有相應的資訊。
舉例:arr=,返回如下的二維陣列作為結果:,,,,,,},其中-1表示不存在
如果arr長度為n,時間複雜度達到o(n)。
資料結構:單調棧,依舊存放陣列元素的索引,但是因為會存在重複的數字,如果依舊和初階問題一樣直接存索引的話,會存在問題,所以棧裡存放列表,列表裡存放索引,相同的索引存在同乙個列表中
使用乙個棧,並且使該棧從棧頂到棧底的值是嚴格遞減的(因為找的是左右兩邊比當前位置小的值)。
流程:遍歷陣列
棧為空或者當前arr[i]大於棧頂中列表的第乙個元素(因為同乙個列表中存放的索引值不同但是對應的陣列值都是一樣的)對應的陣列值,直接新建乙個列表,將當前i加入列表併入棧
若棧不為空,並且當前arr[i]小於棧頂列表中第乙個元素 j(假設為j,因為棧裡存放的是陣列索引值,這裡比較的是arr[i]若棧不為空,並且當前arr[i]小於棧頂列表中第乙個元素 j(假設為j,因為棧裡存放的是陣列索引值,這裡比較的是arr[i]=arr[j]),如果兩個值相等則將當前i,直接加入當前棧頂列表。
遍歷完陣列後,若棧不為空,則對於棧中的所有元素,它們的右邊位置最近並且小於他們的值都不存在即為-1;依次彈出棧頂列表,並對列表中的元素 (假設為j)迭代迴圈,j的右邊為-1,左邊位置為當前棧頂列表中最後插入的值;完成
public int getnearless(int arr)
} //若棧不為空,並且當前陣列值等於棧頂列表中第乙個元素所對應的陣列值
if(!stack.isempty()&&arr[stack.peek().get(0)]==arr[i])else
} //同初階問題,陣列遍歷完後,對棧進行清洗
while(!stack.isempty())
} return res;
}
歡迎隨時交流討論 單調佇列與單調棧
單調棧 單調棧,顧名思義,就是維持單調性 遞增或者遞減 的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性 用途 它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o n 並且單調棧本身並不難實現 維護 每次入棧前先檢驗入棧後是否會破壞棧的單...
單調佇列與單調棧
線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...
單調佇列與單調棧
線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...