1.Deque、Queue
Queue就是FIFO的队列
Deque相当于双向队列,可以首尾添加或删除
总结:在栈和队列的情况中,可以都用Deque类
PriorityQueue:优先队列,可以作为堆使用,当需要根据传入的Comparator实现大小的调整,会是一个很好的选择。
ArrayDeque通常作为栈或队列使用,但是栈的效率不如LinkedList高。
LinkedList通常作为栈或队列使用,但是队列的效率不如ArrayQueue高
【注】ArrayQueue只在删除元素时比LinkedList慢一点
Deque中,addFirst()和push作用相同,都是在栈顶添加,addLast()是添加到栈底
2.在二叉树中递归什么时候需要写return
(1)如果需要搜索整颗二叉树且不用处理递归返回值,递归函数就不要返回值。
(2)如果需要搜索整颗二叉树且需要处理递归返回值,递归函数就需要返回值。
(3)如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。
3.贪心算法
(1)对于不需要求出具体位置的题目,只是要求统计数量或者返回true/false的,优先考虑对数据进行排序。(这是排序是只考虑一维的情况)
对二维数组进行排序:
Arrays.sort(a, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0]==o2[0]) return o1[1]-o2[1];
return o1[0]-o2[0];
}
});
其中o1[1]-o2[1]表示对于第二个元素进行升序排序如果为o2[1]-o1[1]则表示为降序
或者使用lambda表达式:
Arrays.sort(points, (o1, o2) -> Integer.compare(o1[0], o2[0]));
【注】在使用Comparator时,有可能会出现数据越界的情况,比如:o1[0]或o2[0]等于Integer.MAX_VALUE或Integer.MIN_VALUE的情况,这时候需要把compare()方法写成:
Arrays.sort(a, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] > o2[0]) {
return 1;
}else {
return -1;
}
}
});
(2)一般对于数对(j,k),还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程