劍指offer第二版-59.滑動(dòng)窗口的最大值

本系列導(dǎo)航:劍指offer(第二版)java實(shí)現(xiàn)導(dǎo)航帖

面試題59:滑動(dòng)窗口的最大值

題目要求:
給定一個(gè)數(shù)組和滑動(dòng)窗口的大小,請找出所有滑動(dòng)窗口的最大值宾肺。例如,輸入數(shù)組{2,3,4,2,6,2,5,1}和數(shù)字3侵俗,那么一共存在6個(gè)滑動(dòng)窗口锨用,他們的最大值分別為{4,4,6,6,6,5}。

解題思路:
思路1:使用暴力求解隘谣。假設(shè)滑動(dòng)窗口長度為k增拥,每到一個(gè)點(diǎn)都向前遍歷k-1個(gè)節(jié)點(diǎn),那么總時(shí)間復(fù)雜度為o(nk)。

思路2:長度為k的滑動(dòng)窗口其實(shí)可以看成一個(gè)隊(duì)列掌栅,而滑動(dòng)窗口的移動(dòng)可以看成隊(duì)列的出隊(duì)和入隊(duì)秩仆,因此本題可以轉(zhuǎn)化為求長度為k的隊(duì)列的最大值。借助之前做過的9.用兩個(gè)棧實(shí)現(xiàn)隊(duì)列30.包含min函數(shù)的棧猾封,我們可以實(shí)現(xiàn)求隊(duì)列的最大值澄耍。
下面我們分析下時(shí)間與空間復(fù)雜度。用兩個(gè)棧實(shí)現(xiàn)長度為k的隊(duì)列的入隊(duì)時(shí)間復(fù)雜度o(1)晌缘,出隊(duì)時(shí)間復(fù)雜度o(k),空間復(fù)雜度為o(k)齐莲;包含最值函數(shù)的棧(最大深度為k)的時(shí)間復(fù)雜度為o(1),空間復(fù)雜度為o(k)。因此長度為k的隊(duì)列的一次出隊(duì)+入隊(duì)操作(即窗口前移一位)時(shí)間復(fù)雜度為o(k)枚钓,空間復(fù)雜度為o(k)。而這個(gè)窗口需要完成在長度為n的數(shù)組上從頭到尾的滑動(dòng)瑟押,因此搀捷,本解法的時(shí)間復(fù)雜度為o(nk),空間復(fù)雜度o(k)多望。

思路3:把可能成為最大值數(shù)字的下標(biāo)放入雙端隊(duì)列deque嫩舟,從而減少遍歷次數(shù)。首先怀偷,所有在沒有查看后面數(shù)字的情況下家厌,任何一個(gè)節(jié)點(diǎn)都有可能成為某個(gè)狀態(tài)的滑動(dòng)窗口的最大值,因此椎工,數(shù)組中任何一個(gè)元素的下標(biāo)都會(huì)入隊(duì)饭于。關(guān)鍵在于出隊(duì),以下兩種情況下维蒙,該下標(biāo)對應(yīng)的數(shù)字不會(huì)是窗口的最大值需要出隊(duì):(1)該下標(biāo)已經(jīng)在窗口之外掰吕,比如窗口長度為3,下標(biāo)5入隊(duì)颅痊,那么最大值只可能在下標(biāo)3,4,5中出現(xiàn)殖熟,隊(duì)列中如果有下標(biāo)2則需要出隊(duì);(2)后一個(gè)元素大于前面的元素斑响,那么前面的元素出對菱属,比如目前隊(duì)列中有下標(biāo)3、4舰罚,data[3] = 50,data[4]=40纽门,下標(biāo)5入隊(duì),但data[5] = 70营罢,則隊(duì)列中的3膜毁,4都需要出隊(duì)。
數(shù)組{2,3,4,2,6,2,5,1}的長度為3的滑動(dòng)窗口最大值求解步驟如下

步驟    插入數(shù)字    滑動(dòng)窗口    隊(duì)列中的下標(biāo)   最大值
1       2          2           0(2)          N/A          
2       3          2,3         1(3)          N/A   
3       4          2,3,4       2(4)          4   
4       2          3,4,2       2(4),3(2)     4   
5       6          4,2,6       4(6)          6   
6       2          2,6,2       4(6),5(2)     6   
7       5          6,2,5       4(6),6(5)     6   
8       1          2,5,1       6(5),7(1)     5   

時(shí)間復(fù)雜度在o(n)~o(nk)之間,空間復(fù)雜度o(k)瘟滨。
思路3的代碼實(shí)現(xiàn)如下:

package chapter6;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/18
 * Time  : 17:58
 * Description:滑動(dòng)窗口的最大值
 **/
public class P288_MaxInSlidingWindow {
    //把可能會(huì)成為最大值的下標(biāo)存儲(chǔ)下來候醒,從而降低掃描次數(shù)
    public static int[] maxInWindows(int[] data,final int size){
        if(data==null ||data.length==0||data.length<size)
            return new int[0];
        int[] result = new int[data.length-size+1];
        Deque<Integer> deque = new ArrayDeque<>();

        for(int i=0;i<size-1;i++){
            while (!deque.isEmpty()&&data[i]>=data[deque.getLast()])
                deque.removeLast();
            deque.addLast(i);
        }
        for(int i=size-1;i<data.length;i++){
            while (!deque.isEmpty()&&i-deque.getFirst()+1>size)
                deque.removeFirst();
            while (!deque.isEmpty()&&data[deque.getLast()]<=data[i])
                deque.removeLast();
            deque.addLast(i);
            result[i-(size-1)] = data[deque.getFirst()];
        }
        return result;
    }
    public static void main(String[] args){
        int[] data = new int[]{2,3,4,2,6,2,5,1};
        int[] result = maxInWindows(data,3);
        for(int i=0;i<result.length;i++){
            System.out.print(result[i]);
            System.out.print("\t");
        }
    }
}

運(yùn)行結(jié)果

4   4   6   6   6   5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杂瘸,隨后出現(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ī)與錄音买鸽,去河邊找鬼。 笑死贯被,一個(gè)胖子當(dāng)著我的面吹牛眼五,可吹牛的內(nèi)容都是我干的妆艘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼看幼,長吁一口氣:“原來是場噩夢啊……” “哼批旺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诵姜,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤汽煮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后棚唆,有當(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
  • 正文 我和宋清朗相戀三年宵凌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鞋囊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞎惫,死狀恐怖溜腐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情微饥,我是刑警寧澤逗扒,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布古戴,位于F島的核電站欠橘,受9級(jí)特大地震影響,放射性物質(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. 我叫王不留骏掀,地道東北人鸠澈。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓柱告,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笑陈。 傳聞我的和親對象是個(gè)殘疾皇子际度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • 本系列導(dǎo)航:劍指offer(第二版)java實(shí)現(xiàn)導(dǎo)航帖 面試題59.2:隊(duì)列的最大值 題目要求:定義一個(gè)隊(duì)列并實(shí)現(xiàn)...
    ryderchan閱讀 2,278評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • 歸去來兮。 1.1 說明 本篇為《挑戰(zhàn)程序設(shè)計(jì)競賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,330評論 0 160
  • 題目 有一個(gè)整型數(shù)組 arr 和一個(gè)大小為 w 的窗口從數(shù)組的最左邊滑到最右邊,窗口每次向右邊滑一個(gè)位置新锈。 返回一...
    IT_Matters閱讀 2,446評論 0 3
  • 笑不是豁達(dá)甲脏,是傻狗暫時(shí)麻痹自己的辦法。狗想對人人都好妹笆,不是人人都說狗聽話块请。唉,又高估自己了拳缠,狗敢隨地拉屎墩新,我連屁都...
    影子很牽強(qiáng)閱讀 176評論 0 0