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

    如果您觉得本文对你有用,不妨帮忙点个赞,或者在评论里留言交流,欢迎您持续关注我的博客^_^
  • 相关阅读:
    SpringBoot学习:整合shiro(验证码功能和登录次数限制功能)
    SpringBoot学习:整合shiro(rememberMe记住我功能)
    SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存
    SpringBoot学习:整合Redis
    SpringBoot学习:获取yml和properties配置文件的内容
    SpringBoot学习:使用spring-boot-devtools进行热部署
    SpringBoot学习:添加JSP支持
    SpringBoot学习:整合MyBatis,使用Druid连接池
    DL杂谈
    YOLO3训练widerface数据集
  • 原文地址:https://www.cnblogs.com/muxuanchan/p/10511074.html
Copyright © 2011-2022 走看看