滑動窗口最大值

給定一個數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到在滑動窗口 k 內(nèi)的數(shù)字?;瑒哟翱诿看沃幌蛴乙苿右晃弧?/p>

返回滑動窗口最大值。

示例:

輸入: 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
注意:

你可以假設(shè) k 總是有效的,1 ≤ k ≤ 輸入數(shù)組的大小,且輸入數(shù)組不為空。

思路

定義一個雙端隊列MyDeque類,將這隊列作為滑動窗口,先向隊列填窗口前k-1個數(shù),push方法每添加一個數(shù)會先判斷,后添加的數(shù)如果大于之前添加,會將之前添加的數(shù)刪除,可以認(rèn)為后來的數(shù)壓扁錢前面的數(shù),則當(dāng)前組的最大值就是隊頭,往下滑動,要刪除窗口的第一個數(shù),這里需要判斷,這第一個數(shù)可能已經(jīng)后來的數(shù)壓扁,如果沒有壓扁,則需要刪除(因為滑動窗口向右滑動,前面刪除一個數(shù),后面增加一個數(shù))

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {   
        MyDeque myDeque = new MyDeque();
        int res[] = {};
        if (nums == null || nums.length == 0) {
            return res;   
        } else {
            res = new int[nums.length - k + 1];
        }
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (i < k - 1) {
                myDeque.push(nums[i]);
            } else {
                myDeque.push(nums[i]);
                res[j++] = myDeque.max();
                myDeque.pop(nums[i - k + 1]);
            }
        }
        return res;
    }
class MyDeque {

    private Deque<Integer> deque;

    public MyDeque() {
        deque = new LinkedList<Integer>();
    }

    void push(int n) {
        while ((!deque.isEmpty()) && deque.getLast() < n) {
            deque.removeLast();
        }
        deque.addLast(n);
    }

    void pop(int n) {
        if ((!deque.isEmpty()) && deque.getFirst() == n) {
            deque.removeFirst();
        }
        
    }

    int max() {
        return deque.getFirst();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目鏈接難度:困難 類型: 數(shù)組 給定一個數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的...
    wzNote閱讀 4,163評論 0 0
  • 題目描述 給定一個數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到在滑動...
    topshi閱讀 1,113評論 0 2
  • 題目描述 給定一個數(shù)組和滑動窗口的大小,找出所有滑動窗口里數(shù)值的最大值。例如,如果輸入數(shù)組{2,3,4,2,6,2...
    zhouwaiqiang閱讀 257評論 0 0
  • 滑動窗口最大值 給定一個數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到...
    leacoder閱讀 844評論 0 1
  • 內(nèi)容:根據(jù)信用卡持卡人背景信息(年齡、教育水平、當(dāng)前工作年限、當(dāng)前居住年限、家庭收入、債務(wù)占收入比例、信用卡負(fù)債、...
    在做算法的nobody閱讀 590評論 0 0

友情鏈接更多精彩內(nèi)容