02、滑动窗口最大值问题

假设一个固定大小为W的窗口,
依次划过arr返回每一次滑出状况的最大值例如,
arr= [4,3,5,4,3,3,6,71, W = 3
返回:[5,5,5,4,6,7]

/**
 * //arr 代表初始数组(1,5,2,7,3,8)
 * //w 代表滑动窗口的大小(w = 3)
 * @param arr
 * @param w
 * @return
 */
public static int[] getMaxWindow(int[] arr, int w) {
    if (arr == null || w < 1 || arr.length < w) {
        return null;
    }
    // qmax其中放的是位置,arr[位置]
    //约束:位置所代表的值是从大到小的
    LinkedList<Integer> qmax = new LinkedList<Integer>();
    //一共可以形成多少个值(arr.length - w + 1)
    int[] res = new int[arr.length - w + 1];
    int index = 0;
    for (int i = 0; i < arr.length; i++) { // 当前让 i -> [i] 进窗口 , i 就是 r
        //1、进窗口的逻辑
        //队列不为空,且当前i位置的值大于该队列尾部元素值,那么就从队列中弹出
        while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[i]) {
            qmax.pollLast();
        }
        //最后该位置加入到队列,该队列依然保持是从大到小排序的
        qmax.addLast(i);

        //2、出窗口的逻辑
        //(i - w)就是过期的位置
        if (qmax.peekFirst() == i - w) {
            qmax.pollFirst();
        }
        //窗口没有形成w长度之前,是不会弹出元素的
        if (i >= w - 1) {
            res[index++] = arr[qmax.peekFirst()];
        }
    }
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值