给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
代码
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0)
return nums;
//声明一个数组来存放极大值
int[] maxNums = new int[nums.length - k + 1];
//找出滑动窗口一开始的max值并存放到maxNums中
int max = nums[0];
for(int i = 0;i < k;i++)
max = Math.max(max, nums[i]);
maxNums[0] = max;
//从第2个元素开始向后滑动
for(int i = 1;i <= nums.length - k;i++)
{
//如果丢掉的元素是滑动前的最大值max,就得在新的窗口里找一个新的max
if(nums[i - 1] == max)
{
max = nums[i];
for(int j = i + 1;j < i + k;j++)
max = Math.max(max, nums[j]);
}
//如果窗口丢掉的值不是之前的max,那就把max跟新加入的值进行比较就可以了
else {
max = Math.max(max, nums[i + k - 1]);
}
//窗口每一次滑动后产生的max保存到数组里
maxNums[i] = max;
}
return maxNums;
}
解题思路
1.记录前k个元素的最大值
2.因为每两个相邻窗口中有k-2个元素是一样的,如果前一个窗口的最大值max在新的窗口中,只需要把max跟新加入的元素进行比较得出新窗口的最大值就可以了。
如果前一个窗口的max不在新的窗口中,需要在新的窗口中找出max。
记录最后得到的max
3.反复执行第二部就可以找到所有极值了
我讲解的可能不是那么好,这里给大家推荐一位大佬写的文章,写的很详细,希望对你们有所帮助
连接