剑指offer(64)滑动窗口的最大值

import java.util.ArrayList;
import java.util.LinkedList;

public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(num.length == 0 || num == null || size <= 0 || num.length < size){
            return list;
        }
        int[] help = new int[num.length - size + 1];//辅助数组的长度,保存每三个的最大值
        int index = 0;
        LinkedList<Integer> mq = new LinkedList<Integer>();
        for(int i = 0;i < num.length;i++){
            while(!mq.isEmpty() && num[mq.peekLast()] <= num[i]){//保证双端队列的头部一直保存最大值
                mq.pollLast();
            }
            mq.offerLast(i);//进入双端队列的都是坐标而不是值
            if(i - size == mq.peekFirst()){//窗口中的数字超过三个,只要一超过三个,就弹出第一个
                mq.pollFirst();
            }
            if(i >= size - 1){//指针已经走过三个窗口,要开始收集每三个的最大值了
                help[index++] = num[mq.peekFirst()];
            }
        }
        for(int j = 0;j < help.length;j++){//将数组中的数字转存到list中
            list.add(help[j]);
        }
        return list;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值