- 删除有序数组中的重复项Ⅱ
- 轮转数组
- 买卖股票的最佳时机Ⅱ
- 跳跃游戏
- 跳跃游戏Ⅱ
- H指数除自身以外数组的乘积
- 加油站
- O(1) 时间插入、删除和获取随机元素
- 分发糖果 参考题解
- 接雨水 参考题解 单调栈参考 参考题解2—巧妙 参考题解3
笔记
-
ans.toArray(new int[0][])
会创建一个新的int[][]
数组,并将ans
中的元素复制到这个数组中。new int[0][]
是一个空的二维数组,用于告诉toArray
方法返回的数组类型,并根据ans
的大小来创建实际的数组。List<int[]> ans = new ArrayList<>(); return ans.toArray(new int[0][]);
-
按
intervals[][]
的每一行的首元素排序Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
-
区间问题的关键在于左右端点的判断和更新时机
子集型
组合型 剪枝
排列型
笔记
path.split("/")
:将path
字符串按/
拆分成一个字符串数组。
- "/home//user/"的切割结果是: [] home [] user []
- Deque<>
和
Stack<>` 都可以用于实现栈。
-
Deque<>
:LinkedList
实现的Deque
不是线程安全的。如果需要线程安全,可以使用ConcurrentLinkedDeque
。Stack<>
:是线程安全的,因为它的方法是同步的,但这种线程安全特性可能会引入额外的开销。总结
如果应用场景需要线程安全的栈,
Stack<>
可能会更合适。在大多数情况下,特别是当不需要线程安全性时,使用
Deque<>
(尤其是ArrayDeque
实现)会更高效,并且是推荐的做法
StringBuilder
的equals
方法
-
StringBuilder
类的equals
方法并没有被重写,因此它继承了Object
类的默认equals
实现。这个默认实现比较的是对象的引用,而不是对象的内容。 -
因此,
ans.equals("")
会检查ans
对象是否与""
(一个空字符串对象)相同,而这永远是false
,因为StringBuilder
和String
是不同的类,即使StringBuilder
为空,它也不等于一个空字符串。 -
要检查一个
StringBuilder
对象是否为空(即其内容是否为空),应该使用StringBuilder
提供的方法,比如length()
或toString()
- 环形链表
- 环形链表Ⅱ 快慢指针参考题解
- 两数相加
- 合并两个有序链表
- 随机链表的复制 参考题解
- 反转链表Ⅱ
- 反转链表 参考题解
- K个一组翻转链表
- 删除排序链表中的重复元素Ⅱ
- 旋转链表
- 分隔链表 参考题解
- LRU缓存 参考题解
笔记
链表遍历注意
//修改 head 可能会导致链表丢失;使用额外的 current 指针,可以在不改变原链表结构的情况下遍历链表。
-
Queue<Integer> heap = new PriorityQueue<>(); // PriorityQueue 默认是小根堆 PriorityQueue 是一个基于优先级的队列,默认情况下,它按照自然顺序排列元素,即小根堆,堆顶是最小元素。为了实现大根堆,我们可以使用 Collections.reverseOrder() 作为构造参数。 Collections.reverseOrder() 返回一个比较器,这个比较器反转了元素的自然顺序 maxHeap = new PriorityQueue<>(Collections.reverseOrder()); // 大根堆 不提供比较器:使用默认自然顺序(小根堆)。 提供比较器:按照指定的顺序排列元素(可以是大根堆或其他顺序)
-
数组转List
int[] poll = heap.poll(); List<Integer> list = Arrays.stream(poll).boxed().collect(Collectors.toList()); Arrays.stream(poll): 这个方法将 int[] 转换为一个流(Stream)。流是一种可以处理数据序列的功能。 .boxed():这个方法将 int 原始类型的流转换为 Integer 对象的流。因为 Java 的集合类(如 List)只能存储对象,而不能存储原始类型。 .collect(Collectors.toList()):最后,使用 Collectors.toList() 将流收集到一个 List<Integer> 中。这样就完成了从 int[] 到 List<Integer> 的转换。
笔记
-
对称二叉树定义
1.L.val = R.val :即此两对称节点值相等。 2.L.left.val = R.right.val :即 L 的 左子节点 和 R 的 右子节点 对称。 3.L.right.val = R.left.val :即 L 的 右子节点 和 R 的 左子节点 对称。
-
细节
List<TreeNode> cur = new ArrayList<>(); List<TreeNode> next = new ArrayList<>(); cur = next; 将 cur 引用设置为指向 next 对象。cur 和 next 将指向同一个 ArrayList 实例 cur 和 next 共享相同的数据,并且对其中一个的修改需要反映到另一个上
-
Deque<T> cur = new LinkedList<>();和Deque<T> cur = new ArrayDeque<>();
LinkedList 是基于链表的实现。每个元素都包含指向前一个和下一个元素的指针。 ArrayDeque 是基于动态数组的实现,内部使用了数组来存储元素 LinkedList: 更适合频繁的插入和删除操作,尤其是在列表的两端或中间;随机访问较慢,内存开销较大。 ArrayDeque: 更适合频繁的两端插入和删除操作,以及需要较低的内存开销;随机访问性能较好,但在极端情况下可能需要扩展数组的容量
-
二叉搜索树
前序遍历:往左子树,更新当前值为右区间;往右子树,更新当前值为左区间 中序遍历:是个递增数组
拓扑排序
-
map.putIfAbsent(prerequisites[i][1], new ArrayList<>()); putIfAbsent 是 Map 接口的方法,它的功能是: 如果指定的键当前不在 map 中,则将该键和指定的值放入 map。 如果键已经存在,putIfAbsent 不会做任何操作,不会替换原有的值。
-
list.isEmpty() 和 list == null
List<String> list = new ArrayList<>(); System.out.println(list.isEmpty()); // true System.out.println(list == null); // false List<String> list = null; System.out.println(list.isEmpty()); // 会抛出 NullPointerException System.out.println(list == null); // true
笔记
-
在数学上,将一个整数转换为二进制的过程包括以下步骤:
- 除以 2: 将整数除以 2,记录下余数(0 或 1)。
- 记录商: 将除法得到的商作为新的数,重复步骤 1。
- 重复直到商为 0: 继续除以 2,直到商为 0。
- 逆序余数: 最终,二进制表示是余数从最后一次到第一次的逆序排列。
将 13 转换为二进制:
13 ÷ 2 = 6,余数 1
6 ÷ 2 = 3,余数 0
3 ÷ 2 = 1,余数 1
1 ÷ 2 = 0,余数 1
余数从最后到最开始的逆序是 1101,因此 13 的二进制表示是
1101
-
String s = "catsandog"; String result = s.replace("san", ""); // 移除子串 "san"
-
零钱兑换问题