給定乙個整數序列:a1, a2, ..., an,乙個132模式的子串行 ai, aj, ak被定義為:當i<j<k時,ai< ak< aj。設計乙個演算法,當給定有 n 個數字的序列時,驗證這個序列中是否含有132模式的子串行。
注意:n 的值小於15000。
示例1:
輸入:[1, 2, 3, 4]輸出:false解釋:序列中不存在132模式的子串行。示例 2:
輸入:[3, 1, 4, 2]輸出:true解釋:序列中有 1 個132模式的子串行: [1, 4, 2].示例 3:
輸入:[-1, 3, 2, 0]輸出:true解釋:序列中有 3 個132模式的的子串行: [-1, 3, 2], [-1, 3, 0] 和 [-1, 2, 0].原題傳送門:
(1)要求轉換:對於固定的nums[j],在nums[0~j-1]中存在nums[i](2)對於nums[j]左邊,因為nums[i]是最小的,我們希望nums[i]盡量小,這樣才有更大的可能性找到解。因此維護乙個min陣列,其中min[j]表示nums[0~j-1]中最小的值。這個min陣列有個特點,它是非遞增的,因為越往右走,越有可能出現更小的nums[i]。
(3)求解的過程,首先要從右向左遍歷nums陣列。在遍歷的過程中,對於nums[j]右邊,維護乙個類似單調棧的棧,它是單調遞減的,以min[j]為基準。如果min[j](4)尋找nums[k]的過程中,我們希望存在nums[k]>nums[i],即棧中的元素要大於min[j],所以假想把min[j]入棧(實際上沒有入棧),則小於min[j]的元素都要出棧。此時棧中要麼為空,要麼stack[top]>min[j]。如果棧不為空,且如果stack[top](5)關於為什麼以min[j]為基準維護單調棧不會造成漏解的問題。因為min陣列是非遞增的,隨著j的左移,min[j]只會不變或遞增。
public boolean find132pattern(int nums)
for(int i = n - 1; i >= 0; i--)
if(top >= 0 && stack[top] < nums[i])
stack[++top] = nums[i];
} }
return false;
}
單調棧 模板 單調棧模板
biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...
AcWing 單調棧 棧
時 空限制 1s 64mb 給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出 1。第一行包含整數n,表示數列長度。第二行包含n個整數,表示整數數列。共一行,包含n個整數,其中第i個數表示第i個數的左邊第乙個比它小的數,如果不存在則輸出 1。1 n 10 5 1 數列中元素...
棧和佇列 單調佇列 單調棧
講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...