滑动窗口最大值

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;
    }
}

 

posted @ 2020-04-15 15:51  大朱123  阅读(190)  评论(0编辑  收藏  举报