1. 程式人生 > >給定一個數組 nums,有一個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。 返回滑動視窗最大值。

給定一個數組 nums,有一個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。 返回滑動視窗最大值。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
    if(nums == null || nums.length == 0) return new int[0];
        LinkedList<Integer> deque = new LinkedList<Integer>();
        int[] end = new int[nums.length + 1 - k];
        for(int i = 0; i < nums.length; i++){
          if(!deque.isEmpty() && deque.peekFirst() == i - k) deque.poll();//
          保證end中的值都在要查的K個數之內
      while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) deque.removeLast();//刪除end中不大於num[i]的值,因為肯定不會用到
          deque.offerLast(i);
          if((i + 1) >= k) end[i + 1 - k] = nums[deque.peek()];
        }
        return end;
    }
}
       

這裡用到了幾個函式,看程式應該能看懂,我就不解釋了哈
這裡的end是存放查出來的最大值和即將進入視窗的值,其中視窗內的值是降序排列,在num[i]進入視窗之前,已經通過比較,把視窗內不大於num[i]的值丟擲了,這樣對於視窗的每一步移動只需要取最左面的值就OK了,剩下的如果還有疑問就請開尊口問我吧。。。。。