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也有好几年了,却对高并发这部分知之甚少,今年抽时间把这部分啃了,后续会专门写文章分析总结各个并发知识点。欢迎有并发实战经验的同学交流学习。

posted @ 2019-03-11 15:50  陈海翔  阅读(118)  评论(0编辑  收藏  举报