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