zoukankan      html  css  js  c++  java
  • ARTS第十二周

    ARTS是什么?

    Algorithm:每周至少做一个leetcode的算法题;
    Review:阅读并点评至少一篇英文技术文章;
    Tip/Techni:学习至少一个技术技巧;
    Share:分享一篇有观点和思考的技术文章。

    Algorithm

    题目:239. Sliding Window Maximum

    解题思路

    题目要求算出每次滑动窗口时窗口中的最大数,我们考虑使用一种合适的数据结构来存储窗口中的数(聪明的你可以先自己想一下使用哪种数据结构比较好_),这种数据结构首先需要支持移除老的数据,因为窗口移动过程中我们会把老的数据移除出窗口,然后还要支持方便的遍历,因为要取得最大数,必然需要比较窗口中的数。答案揭晓,这里我们准备使用一个队列queue来作为存储窗口数据的容器。

    我们会对窗口中的数据做三个约定:
    1.每次保证窗口最左侧(也就是队列的头部)的数据是最大的数
    2.当窗口中的数到达k个数的时候,把窗口最左侧(也就是队列的头部)的数移出窗口(也就是移出队列)
    3.放入新的数据进窗口的时候,比较窗口中现有的数据,把比新数据小的数都移除。

    代码

      public int[] maxSlidingWindow(int[] nums, int k) {
             if (nums.length < 1 || k <1){
                return new int[0];
            }
    
            //存窗口里元素的下标
            // int[] window = new int[3];
            ArrayDeque<Integer> window = new ArrayDeque(3);
            //存每次窗口里的最大元素
            int[] result = new int[nums.length - k + 1];
    
            int index = 0;
            for (int i = 0; i < nums.length; i++) {
                //当前窗口里大于3个数,把窗口的第一个数去掉
                if (i >= k && window.peekFirst() <= i - k){
                    window.pop();
                }
                //维护队列,新加入一个元素的时候,移除队列中比自己小的元素
                Iterator<Integer> iterator = window.iterator();
                while(iterator.hasNext()){
                    Integer next = iterator.next();
                    if (nums[next] < nums[i]){
                        iterator.remove();
                    }
                }
    
                window.add(i);
                if (i >= k-1){
                    result[index++] = nums[window.peekFirst()];
                }
    
            }
            return result;
        }
    

    Review

    在medium上看到一篇好玩的文章A fun way to teach HTML,读完这篇文章之后记得动手操作一下,简单且有意思。

    文中介绍了一个查看编辑html的工具Mozilla’s X-Ray Goggles。这个工具的作用和浏览器的查看源码类似,不同的是这个工具操作起来很简单,简单到只要轻点你感兴趣的地方就行,简直是指哪打哪,能让你随意查看或编辑网页上的一个页面元素。

    Mozilla’s X-Ray Goggles安装方法:
    1.点我进入官网
    2.打开浏览器的书签页
    3.按照官网上第二步的指示,点击并拖动按钮到书签栏即可。

    Tip/Techni

    优先队列特性,实现方式:堆,二叉搜索树;

    jdk8中的队列有三对方法:add和offer,remove和poll,element和peek。它们之间很相似,但有细微的区别,具体差别如下:

    offer,add区别:

    一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

    这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

    poll,remove区别:

    remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,

    但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

    peek,element区别:

    element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

    Share

    分享一个讲解J.U.C的系列文章,最近本人也在学习这部分的Java基础知识,说来惭愧,使用Java也有好几年了,却对高并发这部分知之甚少,今年抽时间把这部分啃了,后续会专门写文章分析总结各个并发知识点。欢迎有并发实战经验的同学交流学习。

    如果您觉得本文对你有用,不妨帮忙点个赞,或者在评论里留言交流,欢迎您持续关注我的博客^_^
  • 相关阅读:
    Swift网络库Alamofire的导入
    iOS书摘之Objective-C编程之道 iOS设计模式解析
    Crash日志分析
    自动布局库--Masonry使用
    Xcode Ghost
    Xcode8-beat升级需谨慎
    UIView剖析之Draw、Size、Layout方法
    Xcode警告忽略
    属性(property)与成员变量(ivar)
    sql server分页存储过程
  • 原文地址:https://www.cnblogs.com/muxuanchan/p/10511074.html
Copyright © 2011-2022 走看看