Leetcode - Sliding Window Maximum

My code:

public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            int[] ret = new int[0];
            return ret;
        }
        int[] ret = new int[nums.length - k + 1];
        
        
        int pre = -1;
        
        for (int i = 0; i <= nums.length - k; i++) {
            if (pre < i) {
                if (pre >= 0 && nums[i + k - 1] >= nums[pre]) {
                    pre = i + k - 1;
                    ret[i] = nums[pre];
                }
                else {
                    int max = i;
                    for (int j = i + 1; j < i + k; j++) {
                        if (nums[j] >= nums[max]) {
                            max = j;
                        }
                    }
                    pre = max;
                    ret[i] = nums[pre];
                }
            }
            else {
                if (nums[i + k - 1] >= nums[pre]) {
                    pre = i + k - 1;
                }
                ret[i] = nums[pre];
            }
        }
        
        return ret;
    }
}

我自己的解法比較單純,沒用什么額外的數(shù)據(jù)結(jié)構(gòu)。
就是維持一個(gè)指針指向上一層的最大數(shù)的index。如果有多個(gè)數(shù)最大且相等,這個(gè)index選他們之中最大的index
然后邏輯比較簡(jiǎn)單。
如果這個(gè)指針在當(dāng)前范圍之外,那么這個(gè)數(shù)就不用在考慮了。
此時(shí),如果新加進(jìn)來的數(shù)比他更大,那么直接更新指針。
如果小,那么就得遍歷當(dāng)前范圍,找出最大的那個(gè)值,更新指針。
如果在范圍之內(nèi),那么就和新加進(jìn)來的數(shù)比較一下,更新指針。

然后看到了用 Deque 的解法。自己寫了下。

My code:

public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            int[] ret = new int[0];
            return ret;
        }
        int[] ret = new int[nums.length - k + 1];
        
        Deque<Integer> q = new ArrayDeque<Integer>();
        int counter = 0;
        for (int i = 0; i < nums.length; i++) {
            while (!q.isEmpty() && q.peek() < i - k + 1) {
                q.poll();
            }
            while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
                q.pollLast();
            }
            
            q.offerLast(i);
            if (i >= k - 1) {
                ret[counter] = nums[q.peek()];
                counter++;
            }
        }
        
        return ret;
    }
}

reference:
https://discuss.leetcode.com/topic/19055/java-o-n-solution-using-deque-with-explanation/2

對(duì)Deque的API不是很熟悉。
參考:
https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html

他的思想就是類似于一種插入排序,從大到下。只不過把尾部(右側(cè))比自己小的都刪除了。然后每次最大的值都在頭部(左側(cè))。
同時(shí)每次都得把不在范圍內(nèi)的index都刪除掉。
差不多就這樣了。

q.pollFirst(), 對(duì)應(yīng)最左側(cè)
q.pollLast(), 對(duì)應(yīng)最右側(cè)

Anyway, Good luck, Richardo! -- 09/03/2016

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

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,143評(píng)論 25 708
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,392評(píng)論 2 36
  • error code(錯(cuò)誤代碼)=0是操作成功完成。error code(錯(cuò)誤代碼)=1是功能錯(cuò)誤。error c...
    Heikki_閱讀 3,540評(píng)論 1 9
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,927評(píng)論 0 33
  • 人生有泥煤味,也有木桶味, 沒喝醉過的人會(huì)說那都是苦味, 喝醉過的人才知道, 那確實(shí)就是苦味。 ——李誕 文丨舊故...
    舊故麻袋閱讀 360評(píng)論 0 0

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