【Leetcode】#剑指 Offer 59 - I. 滑动窗口的最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

 

 

初始化: 双端队列 deque ,结果列表 res,
若 i > 0 且 队首元素 deque[0]== 被删除元素 nums[i - 1]nums[i−1] :则队首元素出队;
删除 deque内所有 < nums[j]的元素,以保持 deque递减;
将 nums[j]添加至 deque尾部;

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length == 0) {
            return new int[0];
        }
        int[] ans = new int[nums.length - k + 1];
        Deque<Integer> deque = new LinkedList<Integer>();
        for(int i = 0;i < nums.length;i++){
        //若是队列头为划走的数字则删除。
if(i >= k && !deque.isEmpty() && deque.peekFirst() == nums[i-k]){ deque.removeFirst(); }
        //维持队列递减
while(!deque.isEmpty() && deque.peekLast() < nums[i]){ deque.removeLast(); } deque.offer(nums[i]); if(i >= k - 1){ ans[i - k + 1] = deque.peekFirst(); } } return ans; } }

知识点:

deque.peekFirst();  //获取头数据

deque.peekLast();  //获取尾数据

deque.offerFirst();  //添加头

deque.offerLast();  //添加尾

deque.pollFirst();  //返回头并删除

deque.pollLast();  //返回尾并删除

总结:

若是题目为动态队列且求其最大值,使用双向队列Deque,并使用尾删除法。

可以使用单向队列Queue存储数据。

posted @ 2021-12-16 22:19  Canyooo  阅读(32)  评论(0)    收藏  举报