239. 滑動窗口最大值

239. 滑動窗口最大值

給你一個整數(shù)數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)控汉。你只可以看到在滑動窗口內(nèi)的 k 個數(shù)字挤巡∠灯埃滑動窗口每次只向右移動一位拌倍。返回 滑動窗口中的最大值 箱季。

示例 1:
輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3
輸出:[3,3,5,5,6,7]
解釋:
滑動窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length

思路一:利用雙端隊列(單調(diào)隊列)來實現(xiàn)涯穷,隊列從大到小排列,每次給尾部添加時都跟隊列中尾部的值對比藏雏,比要添加的小就刪除拷况;直到nums[隊尾]>nums[i] 為止,接下來添加掘殴;然后更新滑動窗口左邊索引赚瘦,并存儲最大值


時間復(fù)雜度: O(n)
空間復(fù)雜度: O(1)


class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
       
       //處理邊界條件
       if(nums==null||nums.length==0||k<1) return new int[0];
       if(k==1) return nums;
       
       int[] maxes = new int[nums.length - (k-1)];
       
       /**
        創(chuàng)建雙端隊列(單調(diào)隊列)
        使用:
        peek:取值(偷偷瞄一眼)  等價于 get
        poll:刪除(削)        等價于  remove
        offer:添加(入隊)      等價于 add
        */
       Deque<Integer> deque = new ArrayDeque<>();

       for(int ri = 0; ri < nums.length;ri++) {
       
           //1.如果nums[i] >= nums[隊尾],就不斷刪除隊尾 直到nums[隊尾]>nums[i] 為止
           while(!deque.isEmpty() && nums[ri] >= nums[deque.peekLast()]){
                deque.pollLast();
           }

           //2.將i索引加入隊尾
           deque.offerLast(ri);

           //3. 如果wi>=0 先驗證有效性
           int wi = ri - k + 1; //wi就是滑動窗口最左索引
           if(wi<0) continue;
        
          /**
           1>如果隊頭失效奏寨,就移除隊頭(隊頭 < wi 就代表失效,因為隊頭在w索引的左邊 不在滑動窗口范圍內(nèi))
           2>未失效起意,設(shè)置w窗口的最大值為nums[隊頭]
           */
          if(deque.peekFirst() < wi) deque.pollFirst();
          
          maxes[wi] = nums[deque.peekFirst()];
          
       }

       return maxes;
    }
}

執(zhí)行結(jié)果.png

思路二: 暴力法,先求出第一個滑動窗口的最大值病瞳;設(shè)左右邊界揽咕,向右移動 每進來一個新值就跟最大值對比,更新當(dāng)前滑動窗口的最大值套菜;

注意:此方法在我2022年7月 實驗的時候已經(jīng)不適用了亲善,應(yīng)該是官方新增了測試用例,導(dǎo)致性能很低 跑完所有用例時間需要1000ms逗柴,屬于墊底的存在


//暴力法
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
       
       //處理邊界條件
       if(nums==null||nums.length==0||k<1) return new int[0];
       if(k==1) return nums;
       
       int[] maxes = new int[nums.length - (k-1)];
       
       //1.先求出第一段k各元素的最大值
       int maxIdx = 0;
       for(int i = 1; i < k; i++){
           if(nums[i] >= nums[maxIdx]) maxIdx = I;
       }

       //2.li蛹头、ri 滑動左右邊界,對比求出最大值戏溺;得到結(jié)果后添加到數(shù)組
       for(int li = 0; li < maxes.length;li++) {
           int ri = li + k - 1;
           //最大值索引不在滑動窗口范圍內(nèi)
           if(maxIdx < li) {
              //求最大值渣蜗,先假設(shè)li位置的是最大值
              maxIdx = li;
              for(int i = li+1 ;i <= ri;i++) {
                  if(nums[i] >= nums[maxIdx]) maxIdx = I;
              }
           }else if(nums[ri] >= nums[maxIdx]) {//在滑動窗口范圍內(nèi) && 大于等于新進來的值
                 maxIdx = ri;
           }
           //li:表示滑動窗口的索引
           maxes[li] = nums[maxIdx];
       }
       return maxes;
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旷祸,隨后出現(xiàn)的幾起案子耕拷,更是在濱河造成了極大的恐慌,老刑警劉巖托享,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斑胜,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫌吠,警方通過查閱死者的電腦和手機止潘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辫诅,“玉大人凭戴,你說我怎么就攤上這事】话” “怎么了么夫?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵者冤,是天一觀的道長。 經(jīng)常有香客問我档痪,道長涉枫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任腐螟,我火速辦了婚禮愿汰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乐纸。我一直安慰自己衬廷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布汽绢。 她就那樣靜靜地躺著吗跋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宁昭。 梳的紋絲不亂的頭發(fā)上跌宛,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音积仗,去河邊找鬼秩冈。 笑死,一個胖子當(dāng)著我的面吹牛斥扛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丹锹,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼稀颁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楣黍?” 一聲冷哼從身側(cè)響起匾灶,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎租漂,沒想到半個月后阶女,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡哩治,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年秃踩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片业筏。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡憔杨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒜胖,到底是詐尸還是另有隱情消别,我是刑警寧澤抛蚤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站寻狂,受9級特大地震影響岁经,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛇券,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一缀壤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怀读,春花似錦诉位、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啤誊,卻和暖如春岳瞭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚊锹。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工瞳筏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牡昆。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓姚炕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丢烘。 傳聞我的和親對象是個殘疾皇子柱宦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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