• 239. Sliding Window Maximum


    这个题比想象的容易,尤其是看了hints之后。

    本质是要保留窗内元素的ORDER,并且删除元素时不影响ORDER。

    说实话如果不看HINTS之后比较难想到,看了HINT就很容易了。

    一个queue,保存index,删除从head删,添加从tail添加。

    每次要保证head是最大的。

    比如 6 2 1 4 7,K = 3

    添加 6 2 1 没什么可说的,此时Queue是这样的:
    0 1 2,注意我们保存的是index.

    到4的时候,首先判断最大元素是不是出界了,或者说是不是在窗户外了。

    最大元素我们把它放在HEAD,(后面会说怎么做),head的index 是 0,出界,那么poll了他,此时queue是
    1 2
    我们要添加4,从尾端添加,要一个一个比较,如果tail元素比当前要小,直接poll了不管它。

    比如我们要保留3个,K = 3, 那么当前元素左边的2个元素只要比自己小,就与结果无关,直接poll了行了,因为他们在。。故我在,我比他们大,they are useless then..

    我们不需要维持大小是3的QUEUE= =

    说得好乱,这个东西其实比较容易理解= =说起来感觉反而有点绕,和KMP一样。

    public class Solution {
        public int[] maxSlidingWindow(int[] nums, int k) {
            if (k == 0) return new int[0];
            int[] res = new int[nums.length - k + 1];
            
            int largest = 0;
            LinkedList<Integer> list = new LinkedList<>();
            
            
            for (int i = 0; i < nums.length; i++) {
                if (!list.isEmpty() && list.peekFirst() <= i - k) {
                    list.pollFirst();
                }
                
                while (!list.isEmpty() && nums[list.peekLast()] < nums[i]) {
                    list.pollLast();
                }
                list.offerLast(i);
                
                if (i - k + 1 >= 0) {
                    res[i - k + 1] = nums[list.peekFirst()];
                }
            }
            
            return res;
        }
    }
    
  • 相关阅读:
    IaaS、PaaS、SaaS
    hyper-V 配置
    解决linux下创建用户时出现Creating mailbox file: File exists
    iframe层级关系调用
    js,jq新增元素 ,on绑定事件无效
    js中!和!!的区别与用法
    form表单禁止button 提交
    Thinkphp5终端创建控制器和模型
    TP5的目录常量和路径
    sublime安装package controlller
  • 原文地址:https://www.cnblogs.com/reboot329/p/6162342.html
Copyright © 2020-2023  润新知