[劍指Offer]-隊列的最大值

題目描述

給定一個數組和滑動窗口的大小,找出所有滑動窗口裏數值的最大值。

例如,如果輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3,那麼一共存在6個滑動窗口,他們的最大值分別爲{4,4,6,6,6,5}; 針對數組{2,3,4,2,6,2,5,1}的滑動窗口有以下6個:
{[2,3,4],2,6,2,5,1},
{2,[3,4,2],6,2,5,1},
{2,3,[4,2,6],2,5,1},
{2,3,4,[2,6,2],5,1},
{2,3,4,2,[6,2,5],1},
{2,3,4,2,6,[2,5,1]}。

解題思路

  • 設置滑動窗口爲k,可以掃描每個滑動窗口的所有數字並找出其中的最大值。如果滑動窗口爲k,則需要O(k)時間才能找出滑動窗口的最大值。對於長度爲n的輸入數組,該方法的時間複雜度爲O(kn)。
算法圖解

寫法簡單不做圖了,書上的那種優化的寫法我一時沒看明白。?

參考代碼:
package offer;

/**
 * 隊列的最大值
 */
public class Offer59 {
    public static void main(String[] args) {
        int nums[] = {2, 3, 4, 2, 6, 2, 5, 1};
        findMaxInQueue(nums, 3);
    }

    /**
     * 暴力   時間複雜度O(nk)
     *
     * @param nums
     * @param K
     */
    static void findMaxInQueue(int nums[], int K) {
        if (nums == null) {
            return;
        }
        if (nums.length < 2) {
            System.out.println(nums[0]);
        }
        for (int i = 0; i < nums.length - 2; i++) {
            int max = nums[i];
            for (int j = 1; j < K; j++) {
                if (max < nums[i + 1]) {
                    max = nums[i + 1];
                }
                i++;
            }
            i = i - 2;
            System.out.println(max);

        }
    }
}

附錄

該題源碼在我的 ?Github 上面!

發佈了171 篇原創文章 · 獲贊 187 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章