視窗最大值陣列

zxc123e發表於2015-09-21

【題目】給出一個整形陣列,例如arr = {5,4,3,5,6,7,6},視窗大小為w=3,視窗每次向右移動一位,輸出每個視窗中最大值組成的陣列。
[5,4,3,]5,6,7,6 視窗最大值為5
5,[4,3,5,]6,7,6 視窗最大值為5
5,4,[3,5,6,]7,6 視窗最大值為6
5,4,3,[5,6,7,]6 視窗最大值為7
5,4,3,5,[6,7,6] 視窗最大值為7
則輸出的陣列為{5,5,6,7,7};

【解答】對於一個給定的陣列,求得的最終陣列長度可以確定是arr.length - w +1, 本題重點是使用雙端佇列來更新最大值小標,並同時將最大值存入陣列中。保證時間複雜度為O(n)。

程式碼:

    public static int[] getWindowMax(int[] arr, int w)
    {
        if (arr == null || arr.length == 0)
        {
            return null;
        }
        LinkedList<Integer> list = new LinkedList<Integer>();
        int[] res = new int[arr.length-w+1];
        int index = 0;
        for (int i = 0; i < arr.length; i++)
        {
            //保證列表中第一位是最大值下標
            while (!list.isEmpty() && arr[list.getLast()] <= arr[i])
            {
                list.pollLast();
            }
            list.add(i);
            //刪除過期下標
            if (list.getFirst() == i - w)
            {
                list.pollFirst();
            }
            if (i >= w-1)
            {
                res[index++] = arr[list.peekFirst()];
            }
        }
        return res;
    }

相關文章