给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力法:
从0开始作为左边界,k-1作为右边界,求出当前窗口的最大值,然后窗口不断右移,不断找出最大值,直到右边界为length-1为止。
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int length = nums.length; if(length == 0){ return nums; } int[] result = new int[length-k+1]; int left = 0; int right = left + k -1; int index = 0; while(right < length) { int cur = left, maximum=nums[left]; while(cur<= right) { maximum=maximum>nums[cur]?maximum:nums[cur]; ++cur; } result[index++] = maximum; left++; right++; } return result; } }
暴力法非常简单直白,然而,在每个窗口找最大值的时候,其实有相当多一部分元素之前已经比较过了,但这里还是要重复去比较,显得比较浪费。因此,我们可以记录以前比较的结果:最大值及其下标。在下一个窗口时,其实需要比较的只是新加进去的元素,亦即窗口的右边界,如果大于当前最大值,即更新,否则就保留。这个做法需要注意的是,上一个窗口的最大值,是否仍然存在于当前的窗口中。
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int length = nums.length; if(length == 0){ return nums; } int[] result = new int[length-k+1]; int max = nums[0]; int maxIndex = 0; int index = 0; for(int j = 1; j < k; j++) { if(nums[j] > max) { max = nums[j]; maxIndex = j; } } result[index++] = max; for(int left = 1; left < length-k+1; left++) { if(maxIndex < left) { max = nums[left]; maxIndex = left; for(int idx = left+k-1; idx > left; idx--) { if(nums[idx] > max) { max = nums[idx]; maxIndex = idx; } } result[index++] = max; }else { if(nums[left+k-1] > max) { max = nums[left+k-1]; maxIndex = left+k-1; result[index++] = max; }else { result[index++] = max; } } } return result; } }