刷题-剑指Offer-64. 滑动窗口的最大值(双指针)

64. 滑动窗口的最大值

题目链接

来源:剑指Offer
链接:https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&&tqId=11217&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度的时候,返回空

示例1
输入
复制
[2,3,4,2,6,2,5,1],3
返回值
复制
[4,4,6,6,6,5]

题目分析

应用窗口的注意事项
滑动窗口的长度可以固定,也可以是可变的,根据题目要求
可以通过两个指针来标识窗口的边界

import java.util.*;
public class Solution {
    
    
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
    
    
        ArrayList<Integer> list = new ArrayList<>();
        if(size<1 || num.length<size){
    
    
            return list;
        }
        //窗口长度固定
        int left = 0;
        int right = size-1;
        while(right < num.length)
        {
    
    
            list.add(calcMax(num,left,right));
            left++;
            right++;
        }
        return list;
    }
    /**计算出当前数组[left,right]范围内最大的数字*/
    public int calcMax(int[] num,int left,int right)
    {
    
    
        int max = num[left];
        for(int i = left; i<=right; i++){
    
    
            if(num[i] > max)
            {
    
    
                max = num[i];
            }
        }
        return max;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42771487/article/details/113359024
今日推荐