剑指 Offer.59-I.滑动窗口的最大值
剑指 Offer.59-I.滑动窗口的最大值
题目链接
剑指 Offer 59 - I. 滑动窗口的最大值
问题描述
给定一个数组 nums
和滑动窗口的大小 k
,请找出所有滑动窗口里的最大值。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人想法(模拟)
移动窗口每变化一次,对当前窗口的元素进行扫描,返回当前窗口中最大的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0) return new int[0]; int left = 0; int right = k-1; List<Integer> res = new ArrayList<>(); while(right < nums.length){ int windowsMax = Integer.MIN_VALUE; for(int i = left;i <= right;i++){ windowsMax = Math.max(windowsMax,nums[i]); } res.add(windowsMax); left++; right++; } int [] resArray = new int[res.size()]; for(int i=0;i<res.size();i++){ resArray[i] = res.get(i); } return resArray; } }
|
个人想法(递减队列)
在窗口动态变化的过程中,始终维护一个递减队列,当左边界变化时,判断当前最大元素是否为左边界的元素,若是,则将该元素从队首移除
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0) return new int[0]; Deque<Integer> deque = new LinkedList<>(); int left = 0; int right = k-1; List<Integer> res = new ArrayList<>(); for(int i = left;i <= right;i++){ while(!deque.isEmpty() && nums[i] > deque.peekLast()){ deque.pollLast(); } deque.offerLast(nums[i]); } while(right < nums.length){ res.add(deque.peekFirst()); if(deque.peekFirst().equals(nums[left])){ deque.pollFirst(); } left++; right++; if(right<nums.length){ while(!deque.isEmpty() && nums[right] > deque.peekLast()){ deque.pollLast(); } deque.offerLast(nums[right]); } }
int [] resArray = new int[res.size()]; for(int i=0;i<res.size();i++){ resArray[i] = res.get(i); } return resArray; } }
|