單調(diào)隊(duì)列和單調(diào)棧
這倆東西好像差不多,放一起總結(jié)吧。
單調(diào)棧:
a0,a1,a2,a3,a4...ax...an
求ax左邊第一個(gè)大于ax的元素
取 ai,aj (i<j),滿足ai<aj:則對(duì)于ax(x>j),ai一定不是ax左邊第一個(gè)大于ax的元素。
————————
單調(diào)隊(duì)列:
a0,a1,a2,a3,a4...ax...an
取窗口長(zhǎng)度k,{a0~ak-1},求窗口里最大的元素。窗口每次向右滑動(dòng)一格
取?ai,aj (i<j),滿足ai<aj,且ij都在窗口內(nèi),則ai一定不會(huì)是本窗口以及往后的任何窗口的解。ai彈出。到此為止是單調(diào)棧的部分】
窗口往后滑一格,隊(duì)列頭部元素如果在窗口外,彈出(單調(diào)隊(duì)列與stack的區(qū)別)
——————————————————————
換成算法大概就是
for?ai{
????//ai是新iterate到的元素
????ai可能是窗口的解也可能不是,這要根據(jù)a[i+k]來判斷,其中k>0
????但可以根據(jù)ai判斷aj,j<i
????綜上,如果ai符合要求或者比aj更具有某種特點(diǎn),【并且ai比aj距離目標(biāo)的物理距離更近(比如在窗口內(nèi)更靠后的位置,或者距離要對(duì)比的ax更近)】,則aj就要被pop掉
}
標(biāo)簽: