【LeetCode刷题记录】239滑动窗口问题

在这里插入图片描述
思路:这里构造了一个双向列表,一个一个把数据插入到队列中,如果当前插入的数据小于队尾的值,直接插入;如果当前的数大于队尾的值,把队尾的值弹出后直到队尾的数不再小于当前的值再插入,这样得到的一个队列实际上就是一个按从大到小顺序排列的队列,在把队头最大的值放入结果中时还应该考虑当前队头的值在不在滑动窗口内,如果不在就弹出。为了判断这里的队头的值在不在滑动列表中,这里queue存储的是nums中的下标。

var maxSlidingWindow = function(nums, k) {
   var queue=[],result=[];//定义一个双向链表和一个储存结果的数组
   for(let i=0;i<nums.length;i++){
       while(queue.length!=0&&nums[queue[queue.length-1]]<=nums[i]){//当队列不为空,且队尾的值小于当前要插入的值时,把队尾的数弹出
           queue.pop();
       }
       //因为小于当前数的值都弹出了,所以当前值插在队尾就是最小值
       queue.push(i);
       //如果队头的值不在当前的滑动窗口内,就把队头的值弹出
   if(queue[0]<=i-k){
       queue.shift();
   }
   //当可以构成一个滑动窗口时,把对头的值存入结果中
   if(i+1 >= k){
    result[i+1-k] = nums[queue[0]];
   }}
   return result;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值