滑動窗口中的最大值

題目

有一個整型數(shù)組 arr 和一個大小為 w 的窗口從數(shù)組的最左邊滑到最右邊,窗口每次向右邊滑一個位置堤尾。 返回一個長度為n-w+1的數(shù)組res良姆,res[i]表示每一種窗口狀態(tài)下的最大值趁冈。 以數(shù)組為[4,3,5,4,3,3,6,7]硅则,w=3為例怪瓶。因?yàn)榈谝粋€窗口[4,3,5]的最大值為5世蔗,第二個窗口[3,5,4]的最大值為5,第三個窗口[5,4,3]的最大值為5驼唱。第四個窗口[4,3,3]的最大值為4藻茂。第五個窗口[3,3,6]的最大值為6。第六個窗口[3,6,7]的最大值為7玫恳。所以最終返回[5,5,5,4,6,7]辨赐。
給定整形數(shù)組arr及它的大小n,同時給定w京办,請返回res數(shù)組掀序。保證w小于等于n,同時保證數(shù)組大小小于等于500惭婿。

測試樣例:[4,3,5,4,3,3,6,7],8,3
返回:[5,5,5,4,6,7]

思路

用雙端隊列deque保存可能成為滑動窗口中最大元素的下標(biāo)不恭,進(jìn)出隊列規(guī)則如下:

  1. 如果deque為空,直接將下標(biāo)i放入deque中财饥。
  2. 如果當(dāng)前下標(biāo)i-隊頭元素==w,彈出隊頭元素换吧。
  3. 如果deque不為空,取出deque隊尾的下標(biāo)j钥星,如果arr[j]>=arr[i],將下標(biāo)i放入deque隊尾沾瓦。否則依次彈出隊尾元素,直到arr[j]<arr[i]或者deque為空谦炒,再將i壓入隊尾贯莺。

1和2都比較好理解,這里解釋一下3:

如果arr[j]>=arr[i],將下標(biāo)i放入deque隊尾宁改。否則依次彈出隊尾元素缕探,直到arr[j]<arr[i]或者deque為空,再將i壓入隊尾.

arr[j]>=arr[i],為什么要放在隊尾呢还蹲,arr[i]雖然此時比arr[j]小爹耗,但是arr[j]會在一定時間后失效(即脫出滑動窗口范圍),arr[i]可能會成為最大值。
而當(dāng)arr[j]<arr[i],說明arr[j]永遠(yuǎn)不能成為當(dāng)前窗口及以后窗口的最大值了谜喊,因?yàn)閍rr[j]不僅比arr[i]小鲸沮,而且一定比arr[j]先失效。所以將其彈出即可锅论。

當(dāng)初始隊列構(gòu)造完成后讼溺,依次讀入數(shù)組元素,隊列的頭元素的下標(biāo)所代表的數(shù)字就是此時窗口中的最大值最易。

代碼

import java.util.*;

public class SlideWindow {
    public int[] slide(int[] arr, int n, int w) {
        
        int[]result=new int[n-w+1];
        Deque<Integer> window=new ArrayDeque<>();
        //初始化寬度為w的滑動窗口
        int i=0;
        for(;i<w;i++){
            if(!window.isEmpty()&&arr[i]>arr[window.getLast()]){
                while(!window.isEmpty()&&arr[window.getLast()]<arr[i]){
                    window.removeLast();
                }
            } 
            window.addLast(i);
        }
        int size=0;
        result[size]=arr[window.getFirst()];
        
        //依次進(jìn)行滑動
        for(;i<n;i++){
            if(i-window.getFirst()==w){
                window.removeFirst();
            }
            
            if(!window.isEmpty()&&arr[i]>arr[window.getLast()]){
                while(!window.isEmpty()&&arr[window.getLast()]<arr[i]){
                    window.removeLast();
                }
            } 
            window.addLast(i);
            result[++size]=arr[window.getFirst()];
        }
        return result;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怒坯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藻懒,更是在濱河造成了極大的恐慌剔猿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嬉荆,死亡現(xiàn)場離奇詭異归敬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門汪茧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椅亚,“玉大人,你說我怎么就攤上這事舱污⊙教颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵扩灯,是天一觀的道長媚赖。 經(jīng)常有香客問我,道長珠插,這世上最難降的妖魔是什么惧磺? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮捻撑,結(jié)果婚禮上磨隘,老公的妹妹穿的比我還像新娘。我一直安慰自己布讹,他們只是感情好琳拭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著描验,像睡著了一般白嘁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膘流,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天絮缅,我揣著相機(jī)與錄音,去河邊找鬼呼股。 笑死耕魄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彭谁。 我是一名探鬼主播吸奴,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缠局!你這毒婦竟也來了则奥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤狭园,失蹤者是張志新(化名)和其女友劉穎读处,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唱矛,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罚舱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年井辜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片管闷。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡粥脚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渐北,到底是詐尸還是另有隱情阿逃,我是刑警寧澤铭拧,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布赃蛛,位于F島的核電站,受9級特大地震影響搀菩,放射性物質(zhì)發(fā)生泄漏呕臂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一肪跋、第九天 我趴在偏房一處隱蔽的房頂上張望歧蒋。 院中可真熱鬧,春花似錦州既、人聲如沸谜洽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阐虚。三九已至,卻和暖如春蚌卤,著一層夾襖步出監(jiān)牢的瞬間实束,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工逊彭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咸灿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓侮叮,卻偏偏與公主長得像避矢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子囊榜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)审胸。 張土汪:刷leetcod...
    土汪閱讀 12,743評論 0 33
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子锦聊,小兔子...
    趙宇_阿特奇閱讀 1,860評論 0 2
  • 題目 有一個整型數(shù)組arr和一個大小為w的窗口從數(shù)組的最左邊滑到最右邊歹嘹,窗口每次向右邊滑一個位置。 例如孔庭,數(shù)組為[...
    50fc16abfd49閱讀 1,056評論 0 1
  • 某次二面時尺上,面試官問起Js排序問題材蛛,吾絞盡腦汁回答了幾種,深感算法有很大的問題怎抛,所以總計一下卑吭! 排序算法說明 (1...
    流浪的先知閱讀 1,191評論 0 4
  • 萬箭穿心,習(xí)慣就好马绝,可我豆赏,仍渴望逃離宿命的手。什么都不懂的時候遇到敢愛的她富稻,最終掷邦,我學(xué)會了愛,卻也失去了她椭赋,常在淚...
    陌路離殤閱讀 313評論 0 0