給定一個數組 nums,有一個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。 返回滑動視窗最大值。
阿新 • • 發佈:2019-01-11
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了,剩下的如果還有疑問就請開尊口問我吧。。。。。