题解 | #滑动窗口的最大值#

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

/**
*	主要是运用的Deque双向队列 , 双向队列中的元素降序排列 。每次添加进入的元素都要进行判断,如果大于队尾的元
*素,就删除队尾的元素 ,直到找到一个大于该元素的元素 或者队列为空时 将该元素添加至队尾,用begin记录头元素的
*   下标 ,当头元素下标 + size < i 时 队头元素失效 ,pop出对头元素。当 i+1>= 5时窗口形成,每次都将对头元素加入 集合中 。
*/




import java.util.*;
public class Solution {



    public ArrayList<Integer> maxInWindows(int [] num, int size) {
        if(num.length < size || size < 1 || num.length == 0 ) return new ArrayList<Integer>();

         ArrayList<Integer> list =  new ArrayList<>();
         //主要是保证deque中的元素是降序排列
        ArrayDeque<Integer> deque = new ArrayDeque<>();

        int begin = -1;

        for(int i = 0 ; i < num.length ; i++){
            while(!deque.isEmpty() && deque.getLast() < num[i]){
                //将deque中小于当前元素的值舍弃 
                deque.pollLast();
            }
                //将当前元素加入deque中
            deque.add(num[i]);
            if(deque.size() == 1) begin = i;  //记录新的头部的位置
            
            //判断deque头部元素是否过期
            if(begin + size <= i){
                deque.pollFirst();
            }
            
            //判断窗口是否形成 形成则返回队首元素 
            if(i+1 >= size)
            {
                list.add(deque.peekFirst());
            }

        }



       

        return list;
    }


}

全部评论

相关推荐

昨天 17:48
中山大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务