滑动窗口最大值
1:题目描述
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2:题目分析
利用dp思想,记录上一个窗口的最大值和坐标,然后更新右移窗口,根据当前窗口和记录的坐标和最大值的到新的最大值递归状态设计:dp为当前一个窗口的最大值的坐标。然后当前next状态。
转移方程:如果上一个窗口的最大值已经不在当前窗口,选出再遍历找到最大值,如果还在则比较dp和窗口右侧新入值谁大即可。
循环方向:控制窗口向右移动即可
3:代码示例
package JianZhiOffer59; /** * @author :dazhu * @date :Created in 2020/4/15 15:05 * @description: * @modified By: * @version: $ */ public class Main { public static void main(String[] args) { Solution solution = new Solution(); int[] arr = new int[]{1,3,-1,-3,5,3,6,7}; solution.maxSlidingWindow(arr,3); } } //利用dp思想,记录上一个窗口的最大值和坐标,然后更新右移窗口,根据当前窗口和记录的坐标和最大值的到新的最大值 //递归状态设计:dp为当前一个窗口的最大值的坐标。然后当前next // 状态转移方程:如果当前最最大值已经不在当前窗口,选出再遍历找到最大值,如果还在则比较dp和窗口右侧新入值即可 //循环方向:控制窗口向右移动即可 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length==0||nums == null){ return new int[0]; } int dp = -1; int leftIndex = 0; int rightIndex = leftIndex+k-1; int maxIndex = 0; int[] arr = new int[nums.length-k+1]; int index = 0; for(int i=0;i<=nums.length-k;i++){ leftIndex = i; rightIndex = leftIndex+k-1; //当bp已经不在新的窗口中,遍历获取最新的最大值 if(leftIndex>dp){ maxIndex = leftIndex; for(int j=leftIndex;j<=rightIndex;j++){ //遇到大值,在则更新到maxIndex if(nums[j]>nums[maxIndex]){ maxIndex = j; } } } //如果当前dp最大值左边仍在窗口内,则只需要比较dp和最右侧的值谁大就行 else{ if(nums[rightIndex]>nums[dp]){ maxIndex = rightIndex; } } //更新dp dp = maxIndex; //结果存入数组 arr[index++] = nums[dp]; } return arr; } }