Will I leave?.|

Canyooo

园龄:3年6个月粉丝:1关注:1

【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存储数据。

本文作者:Canyooo

本文链接:https://www.cnblogs.com/canyooo/p/15700260.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Canyooo  阅读(25)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 黑洞里 方大同
黑洞里 - 方大同
00:00 / 00:00
An audio error has occurred.

Not available