zoukankan      html  css  js  c++  java
  • Leetconde(239):利用双向队列解滑动窗口问题

    题目描述

    解题思路

    维护以下2个动态数组
    1、双向队列temp
    它用于保存原数组的下标,队首是当前窗口中的最大值
    利用pop方法实现队尾出队,利用splice(0,1)实现队首出队
    2、普通数组arr
    在每一轮循环最后,将temp的队首推入arr
    循环结束后,返回arr

    其实我们可以弱化“窗口”这个概念,因为对于队列temp来说,它的长度是不固定的

    为了简化表述,将会用队列代指temp

    在每一轮循环中(i从0走到nums.length-1)

    • 若队首已不在窗口中,则队首出队
    • 将当前元素nums[i]依次与队列尾部元素进行比较:若nums[i]较大,则当前队尾应该出队(因为它不可能在将来成为队首);直到nums[i]较小 or 队列已空
    • 当前元素nums[i]入队
    • 从第K次循环开始(i>=k-1),将队首放入数组arr中

    代码

    /**
     * @param {number[]} nums
     * @param {number} k
     * @return {number[]}
     */
    var maxSlidingWindow = function(nums, k) {
        var temp=new Array()
        var arr=new Array()
    
        //var finished=nums.length-k
        for(let i=0;i<nums.length;i++){
            if(i==0){
                temp.push(i)
            }else{
    
                if(Math.abs(i-temp[0])>=k){
                    temp.splice(0,1)
                }
    
                while(true){
                    if(temp.length===0){
                        break
                    }
    
                    let j=temp[temp.length-1]//temp队尾
                    if(nums[j]<nums[i]){
                        temp.pop()
                    }else{
                        break
                    }
                }
    
                temp.push(i)
    
            }
    
            if(i>=k-1){
                arr.push(nums[temp[0]])
            }
        }
    
        return arr;
    };
    
  • 相关阅读:
    定时器的应用---查询方式---让8个LED灯,左右各4个来回亮
    单片机实现60s定时器
    单片机不同晶振怎么计算延迟时间?
    573锁存器驱动8段数码管
    51单片机英文引脚等中文对照
    Java【小考】
    viso2010从mysql中导出ER图
    驱动继电器实验
    驱动蜂鸣器的实验
    驱动数码管的实验
  • 原文地址:https://www.cnblogs.com/baebae996/p/13875148.html
Copyright © 2011-2022 走看看