diff --git a/docs/notes/Leetcode 题解 - 二分查找.md b/docs/notes/Leetcode 题解 - 二分查找.md
index 2364654f..0c67a591 100644
--- a/docs/notes/Leetcode 题解 - 二分查找.md
+++ b/docs/notes/Leetcode 题解 - 二分查找.md
@@ -1,23 +1,14 @@
-* [原理](#原理)
- * [1. 正常实现](#1-正常实现)
- * [2. 时间复杂度](#2-时间复杂度)
- * [3. m 计算](#3-m-计算)
- * [4. 未成功查找的返回值](#4-未成功查找的返回值)
- * [5. 变种](#5-变种)
-* [例题](#例题)
- * [1. 求开方](#1-求开方)
- * [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
- * [3. 有序数组的 Single Element](#3-有序数组的-single-element)
- * [4. 第一个错误的版本](#4-第一个错误的版本)
- * [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
- * [6. 查找区间](#6-查找区间)
+* [1. 求开方](#1-求开方)
+* [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
+* [3. 有序数组的 Single Element](#3-有序数组的-single-element)
+* [4. 第一个错误的版本](#4-第一个错误的版本)
+* [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
+* [6. 查找区间](#6-查找区间)
-# 原理
-
-## 1. 正常实现
+**正常实现**
```text
Input : [1,2,3,4,5]
@@ -42,11 +33,11 @@ public int binarySearch(int[] nums, int key) {
}
```
-## 2. 时间复杂度
+**时间复杂度**
二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度为 O(logN)。
-## 3. m 计算
+**m 计算**
有两种计算中值 m 的方式:
@@ -55,14 +46,14 @@ public int binarySearch(int[] nums, int key) {
l + h 可能出现加法溢出,也就是说加法的结果大于整型能够表示的范围。但是 l 和 h 都为正数,因此 h - l 不会出现加法溢出问题。所以,最好使用第二种计算法方法。
-## 4. 未成功查找的返回值
+**未成功查找的返回值**
循环退出时如果仍然没有查找到 key,那么表示查找失败。可以有两种返回值:
- -1:以一个错误码表示没有查找到 key
- l:将 key 插入到 nums 中的正确位置
-## 5. 变种
+**变种**
二分查找可以有很多变种,变种实现要注意边界值的判断。例如在一个有重复元素的数组中查找 key 的最左位置的实现如下:
@@ -103,9 +94,7 @@ l m h
当循环体退出时,不表示没有查找到 key,因此最后返回的结果不应该为 -1。为了验证有没有查找到,需要在调用端判断一下返回位置上的值和 key 是否相等。
-# 例题
-
-## 1. 求开方
+# 1. 求开方
[69. Sqrt(x) (Easy)](https://leetcode.com/problems/sqrtx/description/)
@@ -143,7 +132,7 @@ public int mySqrt(int x) {
}
```
-## 2. 大于给定元素的最小元素
+# 2. 大于给定元素的最小元素
[744. Find Smallest Letter Greater Than Target (Easy)](https://leetcode.com/problems/find-smallest-letter-greater-than-target/description/)
@@ -177,7 +166,7 @@ public char nextGreatestLetter(char[] letters, char target) {
}
```
-## 3. 有序数组的 Single Element
+# 3. 有序数组的 Single Element
[540. Single Element in a Sorted Array (Medium)](https://leetcode.com/problems/single-element-in-a-sorted-array/description/)
@@ -214,7 +203,7 @@ public int singleNonDuplicate(int[] nums) {
}
```
-## 4. 第一个错误的版本
+# 4. 第一个错误的版本
[278. First Bad Version (Easy)](https://leetcode.com/problems/first-bad-version/description/)
@@ -239,7 +228,7 @@ public int firstBadVersion(int n) {
}
```
-## 5. 旋转数组的最小数字
+# 5. 旋转数组的最小数字
[153. Find Minimum in Rotated Sorted Array (Medium)](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/)
@@ -263,7 +252,7 @@ public int findMin(int[] nums) {
}
```
-## 6. 查找区间
+# 6. 查找区间
[34. Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/)
diff --git a/docs/notes/Leetcode 题解 - 位运算.md b/docs/notes/Leetcode 题解 - 位运算.md
index 0dd47fec..fee6a009 100644
--- a/docs/notes/Leetcode 题解 - 位运算.md
+++ b/docs/notes/Leetcode 题解 - 位运算.md
@@ -1,28 +1,21 @@
-* [原理](#原理)
- * [1. 基本原理](#1-基本原理)
- * [2. mask 计算](#2-mask-计算)
- * [3. Java 中的位操作](#3-java-中的位操作)
-* [例题](#例题)
- * [统计两个数的二进制表示有多少位不同](#统计两个数的二进制表示有多少位不同)
- * [数组中唯一一个不重复的元素](#数组中唯一一个不重复的元素)
- * [找出数组中缺失的那个数](#找出数组中缺失的那个数)
- * [数组中不重复的两个元素](#数组中不重复的两个元素)
- * [翻转一个数的比特位](#翻转一个数的比特位)
- * [不用额外变量交换两个整数](#不用额外变量交换两个整数)
- * [判断一个数是不是 2 的 n 次方](#判断一个数是不是-2-的-n-次方)
- * [判断一个数是不是 4 的 n 次方](#判断一个数是不是-4-的-n-次方)
- * [判断一个数的位级表示是否不会出现连续的 0 和 1](#判断一个数的位级表示是否不会出现连续的-0-和-1)
- * [求一个数的补码](#求一个数的补码)
- * [实现整数的加法](#实现整数的加法)
- * [字符串数组最大乘积](#字符串数组最大乘积)
- * [统计从 0 \~ n 每个数的二进制表示中 1 的个数](#统计从-0-\~-n-每个数的二进制表示中-1-的个数)
+* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
+* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
+* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
+* [4. 数组中不重复的两个元素](#4-数组中不重复的两个元素)
+* [5. 翻转一个数的比特位](#5-翻转一个数的比特位)
+* [6. 不用额外变量交换两个整数](#6-不用额外变量交换两个整数)
+* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
+* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
+* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
+* [10. 求一个数的补码](#10-求一个数的补码)
+* [11. 实现整数的加法](#11-实现整数的加法)
+* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
+* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0-\~-n-每个数的二进制表示中-1-的个数)
-# 原理
-
-## 1. 基本原理
+**基本原理**
0s 表示一串 0,1s 表示一串 1。
@@ -48,7 +41,7 @@ x ^ x = 0 x & x = x x | x = x
- \>\>\> n 为无符号右移,左边会补上 0。
- << n 为算术左移,相当于乘以 2n。
-## 2. mask 计算
+** mask 计算**
要获取 111111111,将 0 取反即可,\~0。
@@ -58,7 +51,7 @@ x ^ x = 0 x & x = x x | x = x
要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 \~(1<<(i+1)-1)。
-## 3. Java 中的位操作
+**Java 中的位操作**
```html
static int Integer.bitCount(); // 统计 1 的数量
@@ -66,9 +59,7 @@ static int Integer.highestOneBit(); // 获得最高位
static String toBinaryString(int i); // 转换为二进制表示的字符串
```
-# 例题
-
-## 统计两个数的二进制表示有多少位不同
+# 1. 统计两个数的二进制表示有多少位不同
[461. Hamming Distance (Easy)](https://leetcode.com/problems/hamming-distance/)
@@ -121,7 +112,7 @@ public int hammingDistance(int x, int y) {
}
```
-## 数组中唯一一个不重复的元素
+# 2. 数组中唯一一个不重复的元素
[136. Single Number (Easy)](https://leetcode.com/problems/single-number/description/)
@@ -140,7 +131,7 @@ public int singleNumber(int[] nums) {
}
```
-## 找出数组中缺失的那个数
+# 3. 找出数组中缺失的那个数
[268. Missing Number (Easy)](https://leetcode.com/problems/missing-number/description/)
@@ -161,7 +152,7 @@ public int missingNumber(int[] nums) {
}
```
-## 数组中不重复的两个元素
+# 4. 数组中不重复的两个元素
[260. Single Number III (Medium)](https://leetcode.com/problems/single-number-iii/description/)
@@ -185,7 +176,7 @@ public int[] singleNumber(int[] nums) {
}
```
-## 翻转一个数的比特位
+# 5. 翻转一个数的比特位
[190. Reverse Bits (Easy)](https://leetcode.com/problems/reverse-bits/description/)
@@ -230,7 +221,7 @@ private int reverseByte(byte b) {
}
```
-## 不用额外变量交换两个整数
+# 6. 不用额外变量交换两个整数
[程序员代码面试指南 :P317](#)
@@ -240,7 +231,7 @@ b = a ^ b;
a = a ^ b;
```
-## 判断一个数是不是 2 的 n 次方
+# 7. 判断一个数是不是 2 的 n 次方
[231. Power of Two (Easy)](https://leetcode.com/problems/power-of-two/description/)
@@ -260,7 +251,7 @@ public boolean isPowerOfTwo(int n) {
}
```
-## 判断一个数是不是 4 的 n 次方
+# 8. 判断一个数是不是 4 的 n 次方
[342. Power of Four (Easy)](https://leetcode.com/problems/power-of-four/)
@@ -280,7 +271,7 @@ public boolean isPowerOfFour(int num) {
}
```
-## 判断一个数的位级表示是否不会出现连续的 0 和 1
+# 9. 判断一个数的位级表示是否不会出现连续的 0 和 1
[693. Binary Number with Alternating Bits (Easy)](https://leetcode.com/problems/binary-number-with-alternating-bits/description/)
@@ -305,7 +296,7 @@ public boolean hasAlternatingBits(int n) {
}
```
-## 求一个数的补码
+# 10. 求一个数的补码
[476. Number Complement (Easy)](https://leetcode.com/problems/number-complement/description/)
@@ -360,7 +351,7 @@ public int findComplement(int num) {
}
```
-## 实现整数的加法
+# 11. 实现整数的加法
[371. Sum of Two Integers (Easy)](https://leetcode.com/problems/sum-of-two-integers/description/)
@@ -374,7 +365,7 @@ public int getSum(int a, int b) {
}
```
-## 字符串数组最大乘积
+# 12. 字符串数组最大乘积
[318. Maximum Product of Word Lengths (Medium)](https://leetcode.com/problems/maximum-product-of-word-lengths/description/)
@@ -409,7 +400,7 @@ public int maxProduct(String[] words) {
}
```
-## 统计从 0 \~ n 每个数的二进制表示中 1 的个数
+# 13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数
[338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/)
diff --git a/docs/notes/Leetcode 题解 - 图.md b/docs/notes/Leetcode 题解 - 图.md
index a19adaad..c98d6b1f 100644
--- a/docs/notes/Leetcode 题解 - 图.md
+++ b/docs/notes/Leetcode 题解 - 图.md
@@ -1,11 +1,11 @@
* [二分图](#二分图)
- * [判断是否为二分图](#判断是否为二分图)
+ * [1. 判断是否为二分图](#1-判断是否为二分图)
* [拓扑排序](#拓扑排序)
- * [课程安排的合法性](#课程安排的合法性)
- * [课程安排的顺序](#课程安排的顺序)
+ * [1. 课程安排的合法性](#1-课程安排的合法性)
+ * [2. 课程安排的顺序](#2-课程安排的顺序)
* [并查集](#并查集)
- * [冗余连接](#冗余连接)
+ * [1. 冗余连接](#1-冗余连接)
@@ -13,7 +13,7 @@
如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点颜色不同,那么这个图就是二分图。
-## 判断是否为二分图
+## 1. 判断是否为二分图
[785. Is Graph Bipartite? (Medium)](https://leetcode.com/problems/is-graph-bipartite/description/)
@@ -72,7 +72,7 @@ private boolean isBipartite(int curNode, int curColor, int[] colors, int[][] gra
常用于在具有先序关系的任务规划中。
-## 课程安排的合法性
+## 1. 课程安排的合法性
[207. Course Schedule (Medium)](https://leetcode.com/problems/course-schedule/description/)
@@ -130,7 +130,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked,
}
```
-## 课程安排的顺序
+## 2. 课程安排的顺序
[210. Course Schedule II (Medium)](https://leetcode.com/problems/course-schedule-ii/description/)
@@ -193,7 +193,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked, List
-* [字符串循环移位包含](#字符串循环移位包含)
-* [字符串循环移位](#字符串循环移位)
-* [字符串中单词的翻转](#字符串中单词的翻转)
-* [两个字符串包含的字符是否完全相同](#两个字符串包含的字符是否完全相同)
-* [计算一组字符集合可以组成的回文字符串的最大长度](#计算一组字符集合可以组成的回文字符串的最大长度)
-* [字符串同构](#字符串同构)
-* [回文子字符串个数](#回文子字符串个数)
-* [判断一个整数是否是回文数](#判断一个整数是否是回文数)
-* [统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
+* [1. 字符串循环移位包含](#1-字符串循环移位包含)
+* [2. 字符串循环移位](#2-字符串循环移位)
+* [3. 字符串中单词的翻转](#3-字符串中单词的翻转)
+* [4. 两个字符串包含的字符是否完全相同](#4-两个字符串包含的字符是否完全相同)
+* [5. 计算一组字符集合可以组成的回文字符串的最大长度](#5-计算一组字符集合可以组成的回文字符串的最大长度)
+* [6. 字符串同构](#6-字符串同构)
+* [7. 回文子字符串个数](#7-回文子字符串个数)
+* [8. 判断一个整数是否是回文数](#8-判断一个整数是否是回文数)
+* [9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#9-统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
-# 字符串循环移位包含
+# 1. 字符串循环移位包含
[编程之美 3.1](#)
@@ -24,7 +24,7 @@ Return : true
s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。
-# 字符串循环移位
+# 2. 字符串循环移位
[编程之美 2.17](#)
@@ -37,7 +37,7 @@ Return "123abcd"
将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321,然后对整个字符串进行翻转,得到 123abcd。
-# 字符串中单词的翻转
+# 3. 字符串中单词的翻转
[程序员代码面试指南](#)
@@ -48,7 +48,7 @@ Return "student a am I"
将每个单词翻转,然后将整个字符串翻转。
-# 两个字符串包含的字符是否完全相同
+# 4. 两个字符串包含的字符是否完全相同
[242. Valid Anagram (Easy)](https://leetcode.com/problems/valid-anagram/description/)
@@ -79,7 +79,7 @@ public boolean isAnagram(String s, String t) {
}
```
-# 计算一组字符集合可以组成的回文字符串的最大长度
+# 5. 计算一组字符集合可以组成的回文字符串的最大长度
[409. Longest Palindrome (Easy)](https://leetcode.com/problems/longest-palindrome/description/)
@@ -110,7 +110,7 @@ public int longestPalindrome(String s) {
}
```
-# 字符串同构
+# 6. 字符串同构
[205. Isomorphic Strings (Easy)](https://leetcode.com/problems/isomorphic-strings/description/)
@@ -138,7 +138,7 @@ public boolean isIsomorphic(String s, String t) {
}
```
-# 回文子字符串个数
+# 7. 回文子字符串个数
[647. Palindromic Substrings (Medium)](https://leetcode.com/problems/palindromic-substrings/description/)
@@ -170,7 +170,7 @@ private void extendSubstrings(String s, int start, int end) {
}
```
-# 判断一个整数是否是回文数
+# 8. 判断一个整数是否是回文数
[9. Palindrome Number (Easy)](https://leetcode.com/problems/palindrome-number/description/)
@@ -195,7 +195,7 @@ public boolean isPalindrome(int x) {
}
```
-# 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
+# 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
[696. Count Binary Substrings (Easy)](https://leetcode.com/problems/count-binary-substrings/description/)
diff --git a/docs/notes/Leetcode 题解 - 栈和队列.md b/docs/notes/Leetcode 题解 - 栈和队列.md
index 912d9a60..997b70d2 100644
--- a/docs/notes/Leetcode 题解 - 栈和队列.md
+++ b/docs/notes/Leetcode 题解 - 栈和队列.md
@@ -1,14 +1,14 @@
-* [用栈实现队列](#用栈实现队列)
-* [用队列实现栈](#用队列实现栈)
-* [最小值栈](#最小值栈)
-* [用栈实现括号匹配](#用栈实现括号匹配)
-* [数组中元素与下一个比它大的元素之间的距离](#数组中元素与下一个比它大的元素之间的距离)
-* [循环数组中比当前元素大的下一个元素](#循环数组中比当前元素大的下一个元素)
+* [1. 用栈实现队列](#1-用栈实现队列)
+* [2. 用队列实现栈](#2-用队列实现栈)
+* [3. 最小值栈](#3-最小值栈)
+* [4. 用栈实现括号匹配](#4-用栈实现括号匹配)
+* [5. 数组中元素与下一个比它大的元素之间的距离](#5-数组中元素与下一个比它大的元素之间的距离)
+* [6. 循环数组中比当前元素大的下一个元素](#6-循环数组中比当前元素大的下一个元素)
-# 用栈实现队列
+# 1. 用栈实现队列
[232. Implement Queue using Stacks (Easy)](https://leetcode.com/problems/implement-queue-using-stacks/description/)
@@ -48,7 +48,7 @@ class MyQueue {
}
```
-# 用队列实现栈
+# 2. 用队列实现栈
[225. Implement Stack using Queues (Easy)](https://leetcode.com/problems/implement-stack-using-queues/description/)
@@ -85,7 +85,7 @@ class MyStack {
}
```
-# 最小值栈
+# 3. 最小值栈
[155. Min Stack (Easy)](https://leetcode.com/problems/min-stack/description/)
@@ -126,7 +126,7 @@ class MinStack {
对于实现最小值队列问题,可以先将队列使用栈来实现,然后就将问题转换为最小值栈,这个问题出现在 编程之美:3.7。
-# 用栈实现括号匹配
+# 4. 用栈实现括号匹配
[20. Valid Parentheses (Easy)](https://leetcode.com/problems/valid-parentheses/description/)
@@ -159,7 +159,7 @@ public boolean isValid(String s) {
}
```
-# 数组中元素与下一个比它大的元素之间的距离
+# 5. 数组中元素与下一个比它大的元素之间的距离
[739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/)
@@ -186,7 +186,7 @@ public int[] dailyTemperatures(int[] temperatures) {
}
```
-# 循环数组中比当前元素大的下一个元素
+# 6. 循环数组中比当前元素大的下一个元素
[503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/)
diff --git a/docs/notes/Leetcode 题解 - 树.md b/docs/notes/Leetcode 题解 - 树.md
index ec244186..68dfb06c 100644
--- a/docs/notes/Leetcode 题解 - 树.md
+++ b/docs/notes/Leetcode 题解 - 树.md
@@ -1,40 +1,40 @@
* [递归](#递归)
- * [树的高度](#树的高度)
- * [平衡树](#平衡树)
- * [两节点的最长路径](#两节点的最长路径)
- * [翻转树](#翻转树)
- * [归并两棵树](#归并两棵树)
- * [判断路径和是否等于一个数](#判断路径和是否等于一个数)
- * [统计路径和等于一个数的路径数量](#统计路径和等于一个数的路径数量)
- * [子树](#子树)
- * [树的对称](#树的对称)
- * [最小路径](#最小路径)
- * [统计左叶子节点的和](#统计左叶子节点的和)
- * [相同节点值的最大路径长度](#相同节点值的最大路径长度)
- * [间隔遍历](#间隔遍历)
- * [找出二叉树中第二小的节点](#找出二叉树中第二小的节点)
+ * [1. 树的高度](#1-树的高度)
+ * [2. 平衡树](#2-平衡树)
+ * [3. 两节点的最长路径](#3-两节点的最长路径)
+ * [4. 翻转树](#4-翻转树)
+ * [5. 归并两棵树](#5-归并两棵树)
+ * [6. 判断路径和是否等于一个数](#6-判断路径和是否等于一个数)
+ * [7. 统计路径和等于一个数的路径数量](#7-统计路径和等于一个数的路径数量)
+ * [8. 子树](#8-子树)
+ * [9. 树的对称](#9-树的对称)
+ * [10. 最小路径](#10-最小路径)
+ * [11. 统计左叶子节点的和](#11-统计左叶子节点的和)
+ * [12. 相同节点值的最大路径长度](#12-相同节点值的最大路径长度)
+ * [13. 间隔遍历](#13-间隔遍历)
+ * [14. 找出二叉树中第二小的节点](#14-找出二叉树中第二小的节点)
* [层次遍历](#层次遍历)
- * [一棵树每层节点的平均数](#一棵树每层节点的平均数)
- * [得到左下角的节点](#得到左下角的节点)
+ * [1. 一棵树每层节点的平均数](#1-一棵树每层节点的平均数)
+ * [2. 得到左下角的节点](#2-得到左下角的节点)
* [前中后序遍历](#前中后序遍历)
- * [非递归实现二叉树的前序遍历](#非递归实现二叉树的前序遍历)
- * [非递归实现二叉树的后序遍历](#非递归实现二叉树的后序遍历)
- * [非递归实现二叉树的中序遍历](#非递归实现二叉树的中序遍历)
+ * [1. 非递归实现二叉树的前序遍历](#1-非递归实现二叉树的前序遍历)
+ * [2. 非递归实现二叉树的后序遍历](#2-非递归实现二叉树的后序遍历)
+ * [3. 非递归实现二叉树的中序遍历](#3-非递归实现二叉树的中序遍历)
* [BST](#bst)
- * [修剪二叉查找树](#修剪二叉查找树)
- * [寻找二叉查找树的第 k 个元素](#寻找二叉查找树的第-k-个元素)
- * [把二叉查找树每个节点的值都加上比它大的节点的值](#把二叉查找树每个节点的值都加上比它大的节点的值)
- * [二叉查找树的最近公共祖先](#二叉查找树的最近公共祖先)
- * [二叉树的最近公共祖先](#二叉树的最近公共祖先)
- * [从有序数组中构造二叉查找树](#从有序数组中构造二叉查找树)
- * [根据有序链表构造平衡的二叉查找树](#根据有序链表构造平衡的二叉查找树)
- * [在二叉查找树中寻找两个节点,使它们的和为一个给定值](#在二叉查找树中寻找两个节点,使它们的和为一个给定值)
- * [在二叉查找树中查找两个节点之差的最小绝对值](#在二叉查找树中查找两个节点之差的最小绝对值)
- * [寻找二叉查找树中出现次数最多的值](#寻找二叉查找树中出现次数最多的值)
+ * [1. 修剪二叉查找树](#1-修剪二叉查找树)
+ * [2. 寻找二叉查找树的第 k 个元素](#2-寻找二叉查找树的第-k-个元素)
+ * [3. 把二叉查找树每个节点的值都加上比它大的节点的值](#3-把二叉查找树每个节点的值都加上比它大的节点的值)
+ * [4. 二叉查找树的最近公共祖先](#4-二叉查找树的最近公共祖先)
+ * [5. 二叉树的最近公共祖先](#5-二叉树的最近公共祖先)
+ * [6. 从有序数组中构造二叉查找树](#6-从有序数组中构造二叉查找树)
+ * [7. 根据有序链表构造平衡的二叉查找树](#7-根据有序链表构造平衡的二叉查找树)
+ * [8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值](#8-在二叉查找树中寻找两个节点,使它们的和为一个给定值)
+ * [9. 在二叉查找树中查找两个节点之差的最小绝对值](#9-在二叉查找树中查找两个节点之差的最小绝对值)
+ * [10. 寻找二叉查找树中出现次数最多的值](#10-寻找二叉查找树中出现次数最多的值)
* [Trie](#trie)
- * [实现一个 Trie](#实现一个-trie)
- * [实现一个 Trie,用来求前缀和](#实现一个-trie,用来求前缀和)
+ * [1. 实现一个 Trie](#1-实现一个-trie)
+ * [2. 实现一个 Trie,用来求前缀和](#2-实现一个-trie,用来求前缀和)
@@ -42,7 +42,7 @@
一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。
-## 树的高度
+## 1. 树的高度
[104. Maximum Depth of Binary Tree (Easy)](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/)
@@ -53,7 +53,7 @@ public int maxDepth(TreeNode root) {
}
```
-## 平衡树
+## 2. 平衡树
[110. Balanced Binary Tree (Easy)](https://leetcode.com/problems/balanced-binary-tree/description/)
@@ -84,7 +84,7 @@ public int maxDepth(TreeNode root) {
}
```
-## 两节点的最长路径
+## 3. 两节点的最长路径
[543. Diameter of Binary Tree (Easy)](https://leetcode.com/problems/diameter-of-binary-tree/description/)
@@ -117,7 +117,7 @@ private int depth(TreeNode root) {
}
```
-## 翻转树
+## 4. 翻转树
[226. Invert Binary Tree (Easy)](https://leetcode.com/problems/invert-binary-tree/description/)
@@ -131,7 +131,7 @@ public TreeNode invertTree(TreeNode root) {
}
```
-## 归并两棵树
+## 5. 归并两棵树
[617. Merge Two Binary Trees (Easy)](https://leetcode.com/problems/merge-two-binary-trees/description/)
@@ -164,7 +164,7 @@ public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
}
```
-## 判断路径和是否等于一个数
+## 6. 判断路径和是否等于一个数
[Leetcdoe : 112. Path Sum (Easy)](https://leetcode.com/problems/path-sum/description/)
@@ -192,7 +192,7 @@ public boolean hasPathSum(TreeNode root, int sum) {
}
```
-## 统计路径和等于一个数的路径数量
+## 7. 统计路径和等于一个数的路径数量
[437. Path Sum III (Easy)](https://leetcode.com/problems/path-sum-iii/description/)
@@ -232,7 +232,7 @@ private int pathSumStartWithRoot(TreeNode root, int sum) {
}
```
-## 子树
+## 8. 子树
[572. Subtree of Another Tree (Easy)](https://leetcode.com/problems/subtree-of-another-tree/description/)
@@ -283,7 +283,7 @@ private boolean isSubtreeWithRoot(TreeNode s, TreeNode t) {
}
```
-## 树的对称
+## 9. 树的对称
[101. Symmetric Tree (Easy)](https://leetcode.com/problems/symmetric-tree/description/)
@@ -309,7 +309,7 @@ private boolean isSymmetric(TreeNode t1, TreeNode t2) {
}
```
-## 最小路径
+## 10. 最小路径
[111. Minimum Depth of Binary Tree (Easy)](https://leetcode.com/problems/minimum-depth-of-binary-tree/description/)
@@ -325,7 +325,7 @@ public int minDepth(TreeNode root) {
}
```
-## 统计左叶子节点的和
+## 11. 统计左叶子节点的和
[404. Sum of Left Leaves (Easy)](https://leetcode.com/problems/sum-of-left-leaves/description/)
@@ -352,7 +352,7 @@ private boolean isLeaf(TreeNode node){
}
```
-## 相同节点值的最大路径长度
+## 12. 相同节点值的最大路径长度
[687. Longest Univalue Path (Easy)](https://leetcode.com/problems/longest-univalue-path/)
@@ -385,7 +385,7 @@ private int dfs(TreeNode root){
}
```
-## 间隔遍历
+## 13. 间隔遍历
[337. House Robber III (Medium)](https://leetcode.com/problems/house-robber-iii/description/)
@@ -409,7 +409,7 @@ public int rob(TreeNode root) {
}
```
-## 找出二叉树中第二小的节点
+## 14. 找出二叉树中第二小的节点
[671. Second Minimum Node In a Binary Tree (Easy)](https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/)
@@ -444,7 +444,7 @@ public int findSecondMinimumValue(TreeNode root) {
使用 BFS 进行层次遍历。不需要使用两个队列来分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。
-## 一棵树每层节点的平均数
+## 1. 一棵树每层节点的平均数
[637. Average of Levels in Binary Tree (Easy)](https://leetcode.com/problems/average-of-levels-in-binary-tree/description/)
@@ -469,7 +469,7 @@ public List averageOfLevels(TreeNode root) {
}
```
-## 得到左下角的节点
+## 2. 得到左下角的节点
[513. Find Bottom Left Tree Value (Easy)](https://leetcode.com/problems/find-bottom-left-tree-value/description/)
@@ -550,7 +550,7 @@ void dfs(TreeNode root) {
}
```
-## 非递归实现二叉树的前序遍历
+## 1. 非递归实现二叉树的前序遍历
[144. Binary Tree Preorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-preorder-traversal/description/)
@@ -570,7 +570,7 @@ public List preorderTraversal(TreeNode root) {
}
```
-## 非递归实现二叉树的后序遍历
+## 2. 非递归实现二叉树的后序遍历
[145. Binary Tree Postorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-postorder-traversal/description/)
@@ -593,7 +593,7 @@ public List postorderTraversal(TreeNode root) {
}
```
-## 非递归实现二叉树的中序遍历
+## 3. 非递归实现二叉树的中序遍历
[94. Binary Tree Inorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-inorder-traversal/description/)
@@ -622,7 +622,7 @@ public List inorderTraversal(TreeNode root) {
二叉查找树中序遍历有序。
-## 修剪二叉查找树
+## 1. 修剪二叉查找树
[669. Trim a Binary Search Tree (Easy)](https://leetcode.com/problems/trim-a-binary-search-tree/description/)
@@ -662,7 +662,7 @@ public TreeNode trimBST(TreeNode root, int L, int R) {
}
```
-## 寻找二叉查找树的第 k 个元素
+## 2. 寻找二叉查找树的第 k 个元素
[230. Kth Smallest Element in a BST (Medium)](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/)
@@ -706,7 +706,7 @@ private int count(TreeNode node) {
}
```
-## 把二叉查找树每个节点的值都加上比它大的节点的值
+## 3. 把二叉查找树每个节点的值都加上比它大的节点的值
[Convert BST to Greater Tree (Easy)](https://leetcode.com/problems/convert-bst-to-greater-tree/description/)
@@ -743,7 +743,7 @@ private void traver(TreeNode node) {
}
```
-## 二叉查找树的最近公共祖先
+## 4. 二叉查找树的最近公共祖先
[235. Lowest Common Ancestor of a Binary Search Tree (Easy)](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
@@ -767,7 +767,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
-## 二叉树的最近公共祖先
+## 5. 二叉树的最近公共祖先
[236. Lowest Common Ancestor of a Binary Tree (Medium) ](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
@@ -792,7 +792,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
-## 从有序数组中构造二叉查找树
+## 6. 从有序数组中构造二叉查找树
[108. Convert Sorted Array to Binary Search Tree (Easy)](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/)
@@ -811,7 +811,7 @@ private TreeNode toBST(int[] nums, int sIdx, int eIdx){
}
```
-## 根据有序链表构造平衡的二叉查找树
+## 7. 根据有序链表构造平衡的二叉查找树
[109. Convert Sorted List to Binary Search Tree (Medium)](https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/)
@@ -852,7 +852,7 @@ private ListNode preMid(ListNode head) {
}
```
-## 在二叉查找树中寻找两个节点,使它们的和为一个给定值
+## 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值
[653. Two Sum IV - Input is a BST (Easy)](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/description/)
@@ -896,7 +896,7 @@ private void inOrder(TreeNode root, List nums) {
}
```
-## 在二叉查找树中查找两个节点之差的最小绝对值
+## 9. 在二叉查找树中查找两个节点之差的最小绝对值
[530. Minimum Absolute Difference in BST (Easy)](https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/)
@@ -934,7 +934,7 @@ private void inOrder(TreeNode node) {
}
```
-## 寻找二叉查找树中出现次数最多的值
+## 10. 寻找二叉查找树中出现次数最多的值
[501. Find Mode in Binary Search Tree (Easy)](https://leetcode.com/problems/find-mode-in-binary-search-tree/description/)
@@ -991,7 +991,7 @@ private void inOrder(TreeNode node, List nums) {
Trie,又称前缀树或字典树,用于判断字符串是否存在或者是否具有某种字符串前缀。
-## 实现一个 Trie
+## 1. 实现一个 Trie
[208. Implement Trie (Prefix Tree) (Medium)](https://leetcode.com/problems/implement-trie-prefix-tree/description/)
@@ -1053,7 +1053,7 @@ class Trie {
}
```
-## 实现一个 Trie,用来求前缀和
+## 2. 实现一个 Trie,用来求前缀和
[677. Map Sum Pairs (Medium)](https://leetcode.com/problems/map-sum-pairs/description/)
diff --git a/docs/notes/Leetcode 题解 - 链表.md b/docs/notes/Leetcode 题解 - 链表.md
index 7b2c16ff..e6a5f4ae 100644
--- a/docs/notes/Leetcode 题解 - 链表.md
+++ b/docs/notes/Leetcode 题解 - 链表.md
@@ -1,20 +1,20 @@
-* [找出两个链表的交点](#找出两个链表的交点)
-* [链表反转](#链表反转)
-* [归并两个有序的链表](#归并两个有序的链表)
-* [从有序链表中删除重复节点](#从有序链表中删除重复节点)
-* [删除链表的倒数第 n 个节点](#删除链表的倒数第-n-个节点)
-* [交换链表中的相邻结点](#交换链表中的相邻结点)
-* [链表求和](#链表求和)
-* [回文链表](#回文链表)
-* [分隔链表](#分隔链表)
-* [链表元素按奇偶聚集](#链表元素按奇偶聚集)
+* [1. 找出两个链表的交点](#1-找出两个链表的交点)
+* [2. 链表反转](#2-链表反转)
+* [3. 归并两个有序的链表](#3-归并两个有序的链表)
+* [4. 从有序链表中删除重复节点](#4-从有序链表中删除重复节点)
+* [5. 删除链表的倒数第 n 个节点](#5-删除链表的倒数第-n-个节点)
+* [6. 交换链表中的相邻结点](#6-交换链表中的相邻结点)
+* [7. 链表求和](#7-链表求和)
+* [8. 回文链表](#8-回文链表)
+* [9. 分隔链表](#9-分隔链表)
+* [10. 链表元素按奇偶聚集](#10-链表元素按奇偶聚集)
链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。
-# 找出两个链表的交点
+# 1. 找出两个链表的交点
[160. Intersection of Two Linked Lists (Easy)](https://leetcode.com/problems/intersection-of-two-linked-lists/description/)
@@ -48,7 +48,7 @@ public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
- 把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;
- 或者直接比较两个链表的最后一个节点是否相同。
-# 链表反转
+# 2. 链表反转
[206. Reverse Linked List (Easy)](https://leetcode.com/problems/reverse-linked-list/description/)
@@ -82,7 +82,7 @@ public ListNode reverseList(ListNode head) {
}
```
-# 归并两个有序的链表
+# 3. 归并两个有序的链表
[21. Merge Two Sorted Lists (Easy)](https://leetcode.com/problems/merge-two-sorted-lists/description/)
@@ -100,7 +100,7 @@ public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
}
```
-# 从有序链表中删除重复节点
+# 4. 从有序链表中删除重复节点
[83. Remove Duplicates from Sorted List (Easy)](https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/)
@@ -117,7 +117,7 @@ public ListNode deleteDuplicates(ListNode head) {
}
```
-# 删除链表的倒数第 n 个节点
+# 5. 删除链表的倒数第 n 个节点
[19. Remove Nth Node From End of List (Medium)](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)
@@ -143,7 +143,7 @@ public ListNode removeNthFromEnd(ListNode head, int n) {
}
```
-# 交换链表中的相邻结点
+# 6. 交换链表中的相邻结点
[24. Swap Nodes in Pairs (Medium)](https://leetcode.com/problems/swap-nodes-in-pairs/description/)
@@ -171,7 +171,7 @@ public ListNode swapPairs(ListNode head) {
}
```
-# 链表求和
+# 7. 链表求和
[445. Add Two Numbers II (Medium)](https://leetcode.com/problems/add-two-numbers-ii/description/)
@@ -210,7 +210,7 @@ private Stack buildStack(ListNode l) {
}
```
-# 回文链表
+# 8. 回文链表
[234. Palindrome Linked List (Easy)](https://leetcode.com/problems/palindrome-linked-list/description/)
@@ -259,7 +259,7 @@ private boolean isEqual(ListNode l1, ListNode l2) {
}
```
-# 分隔链表
+# 9. 分隔链表
[725. Split Linked List in Parts(Medium)](https://leetcode.com/problems/split-linked-list-in-parts/description/)
@@ -299,7 +299,7 @@ public ListNode[] splitListToParts(ListNode root, int k) {
}
```
-# 链表元素按奇偶聚集
+# 10. 链表元素按奇偶聚集
[328. Odd Even Linked List (Medium)](https://leetcode.com/problems/odd-even-linked-list/description/)
diff --git a/notes/Leetcode 题解 - 二分查找.md b/notes/Leetcode 题解 - 二分查找.md
index 2364654f..0c67a591 100644
--- a/notes/Leetcode 题解 - 二分查找.md
+++ b/notes/Leetcode 题解 - 二分查找.md
@@ -1,23 +1,14 @@
-* [原理](#原理)
- * [1. 正常实现](#1-正常实现)
- * [2. 时间复杂度](#2-时间复杂度)
- * [3. m 计算](#3-m-计算)
- * [4. 未成功查找的返回值](#4-未成功查找的返回值)
- * [5. 变种](#5-变种)
-* [例题](#例题)
- * [1. 求开方](#1-求开方)
- * [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
- * [3. 有序数组的 Single Element](#3-有序数组的-single-element)
- * [4. 第一个错误的版本](#4-第一个错误的版本)
- * [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
- * [6. 查找区间](#6-查找区间)
+* [1. 求开方](#1-求开方)
+* [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
+* [3. 有序数组的 Single Element](#3-有序数组的-single-element)
+* [4. 第一个错误的版本](#4-第一个错误的版本)
+* [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
+* [6. 查找区间](#6-查找区间)
-# 原理
-
-## 1. 正常实现
+**正常实现**
```text
Input : [1,2,3,4,5]
@@ -42,11 +33,11 @@ public int binarySearch(int[] nums, int key) {
}
```
-## 2. 时间复杂度
+**时间复杂度**
二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度为 O(logN)。
-## 3. m 计算
+**m 计算**
有两种计算中值 m 的方式:
@@ -55,14 +46,14 @@ public int binarySearch(int[] nums, int key) {
l + h 可能出现加法溢出,也就是说加法的结果大于整型能够表示的范围。但是 l 和 h 都为正数,因此 h - l 不会出现加法溢出问题。所以,最好使用第二种计算法方法。
-## 4. 未成功查找的返回值
+**未成功查找的返回值**
循环退出时如果仍然没有查找到 key,那么表示查找失败。可以有两种返回值:
- -1:以一个错误码表示没有查找到 key
- l:将 key 插入到 nums 中的正确位置
-## 5. 变种
+**变种**
二分查找可以有很多变种,变种实现要注意边界值的判断。例如在一个有重复元素的数组中查找 key 的最左位置的实现如下:
@@ -103,9 +94,7 @@ l m h
当循环体退出时,不表示没有查找到 key,因此最后返回的结果不应该为 -1。为了验证有没有查找到,需要在调用端判断一下返回位置上的值和 key 是否相等。
-# 例题
-
-## 1. 求开方
+# 1. 求开方
[69. Sqrt(x) (Easy)](https://leetcode.com/problems/sqrtx/description/)
@@ -143,7 +132,7 @@ public int mySqrt(int x) {
}
```
-## 2. 大于给定元素的最小元素
+# 2. 大于给定元素的最小元素
[744. Find Smallest Letter Greater Than Target (Easy)](https://leetcode.com/problems/find-smallest-letter-greater-than-target/description/)
@@ -177,7 +166,7 @@ public char nextGreatestLetter(char[] letters, char target) {
}
```
-## 3. 有序数组的 Single Element
+# 3. 有序数组的 Single Element
[540. Single Element in a Sorted Array (Medium)](https://leetcode.com/problems/single-element-in-a-sorted-array/description/)
@@ -214,7 +203,7 @@ public int singleNonDuplicate(int[] nums) {
}
```
-## 4. 第一个错误的版本
+# 4. 第一个错误的版本
[278. First Bad Version (Easy)](https://leetcode.com/problems/first-bad-version/description/)
@@ -239,7 +228,7 @@ public int firstBadVersion(int n) {
}
```
-## 5. 旋转数组的最小数字
+# 5. 旋转数组的最小数字
[153. Find Minimum in Rotated Sorted Array (Medium)](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/)
@@ -263,7 +252,7 @@ public int findMin(int[] nums) {
}
```
-## 6. 查找区间
+# 6. 查找区间
[34. Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/)
diff --git a/notes/Leetcode 题解 - 位运算.md b/notes/Leetcode 题解 - 位运算.md
index 0dd47fec..fee6a009 100644
--- a/notes/Leetcode 题解 - 位运算.md
+++ b/notes/Leetcode 题解 - 位运算.md
@@ -1,28 +1,21 @@
-* [原理](#原理)
- * [1. 基本原理](#1-基本原理)
- * [2. mask 计算](#2-mask-计算)
- * [3. Java 中的位操作](#3-java-中的位操作)
-* [例题](#例题)
- * [统计两个数的二进制表示有多少位不同](#统计两个数的二进制表示有多少位不同)
- * [数组中唯一一个不重复的元素](#数组中唯一一个不重复的元素)
- * [找出数组中缺失的那个数](#找出数组中缺失的那个数)
- * [数组中不重复的两个元素](#数组中不重复的两个元素)
- * [翻转一个数的比特位](#翻转一个数的比特位)
- * [不用额外变量交换两个整数](#不用额外变量交换两个整数)
- * [判断一个数是不是 2 的 n 次方](#判断一个数是不是-2-的-n-次方)
- * [判断一个数是不是 4 的 n 次方](#判断一个数是不是-4-的-n-次方)
- * [判断一个数的位级表示是否不会出现连续的 0 和 1](#判断一个数的位级表示是否不会出现连续的-0-和-1)
- * [求一个数的补码](#求一个数的补码)
- * [实现整数的加法](#实现整数的加法)
- * [字符串数组最大乘积](#字符串数组最大乘积)
- * [统计从 0 \~ n 每个数的二进制表示中 1 的个数](#统计从-0-\~-n-每个数的二进制表示中-1-的个数)
+* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
+* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
+* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
+* [4. 数组中不重复的两个元素](#4-数组中不重复的两个元素)
+* [5. 翻转一个数的比特位](#5-翻转一个数的比特位)
+* [6. 不用额外变量交换两个整数](#6-不用额外变量交换两个整数)
+* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
+* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
+* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
+* [10. 求一个数的补码](#10-求一个数的补码)
+* [11. 实现整数的加法](#11-实现整数的加法)
+* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
+* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0-\~-n-每个数的二进制表示中-1-的个数)
-# 原理
-
-## 1. 基本原理
+**基本原理**
0s 表示一串 0,1s 表示一串 1。
@@ -48,7 +41,7 @@ x ^ x = 0 x & x = x x | x = x
- \>\>\> n 为无符号右移,左边会补上 0。
- << n 为算术左移,相当于乘以 2n。
-## 2. mask 计算
+** mask 计算**
要获取 111111111,将 0 取反即可,\~0。
@@ -58,7 +51,7 @@ x ^ x = 0 x & x = x x | x = x
要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 \~(1<<(i+1)-1)。
-## 3. Java 中的位操作
+**Java 中的位操作**
```html
static int Integer.bitCount(); // 统计 1 的数量
@@ -66,9 +59,7 @@ static int Integer.highestOneBit(); // 获得最高位
static String toBinaryString(int i); // 转换为二进制表示的字符串
```
-# 例题
-
-## 统计两个数的二进制表示有多少位不同
+# 1. 统计两个数的二进制表示有多少位不同
[461. Hamming Distance (Easy)](https://leetcode.com/problems/hamming-distance/)
@@ -121,7 +112,7 @@ public int hammingDistance(int x, int y) {
}
```
-## 数组中唯一一个不重复的元素
+# 2. 数组中唯一一个不重复的元素
[136. Single Number (Easy)](https://leetcode.com/problems/single-number/description/)
@@ -140,7 +131,7 @@ public int singleNumber(int[] nums) {
}
```
-## 找出数组中缺失的那个数
+# 3. 找出数组中缺失的那个数
[268. Missing Number (Easy)](https://leetcode.com/problems/missing-number/description/)
@@ -161,7 +152,7 @@ public int missingNumber(int[] nums) {
}
```
-## 数组中不重复的两个元素
+# 4. 数组中不重复的两个元素
[260. Single Number III (Medium)](https://leetcode.com/problems/single-number-iii/description/)
@@ -185,7 +176,7 @@ public int[] singleNumber(int[] nums) {
}
```
-## 翻转一个数的比特位
+# 5. 翻转一个数的比特位
[190. Reverse Bits (Easy)](https://leetcode.com/problems/reverse-bits/description/)
@@ -230,7 +221,7 @@ private int reverseByte(byte b) {
}
```
-## 不用额外变量交换两个整数
+# 6. 不用额外变量交换两个整数
[程序员代码面试指南 :P317](#)
@@ -240,7 +231,7 @@ b = a ^ b;
a = a ^ b;
```
-## 判断一个数是不是 2 的 n 次方
+# 7. 判断一个数是不是 2 的 n 次方
[231. Power of Two (Easy)](https://leetcode.com/problems/power-of-two/description/)
@@ -260,7 +251,7 @@ public boolean isPowerOfTwo(int n) {
}
```
-## 判断一个数是不是 4 的 n 次方
+# 8. 判断一个数是不是 4 的 n 次方
[342. Power of Four (Easy)](https://leetcode.com/problems/power-of-four/)
@@ -280,7 +271,7 @@ public boolean isPowerOfFour(int num) {
}
```
-## 判断一个数的位级表示是否不会出现连续的 0 和 1
+# 9. 判断一个数的位级表示是否不会出现连续的 0 和 1
[693. Binary Number with Alternating Bits (Easy)](https://leetcode.com/problems/binary-number-with-alternating-bits/description/)
@@ -305,7 +296,7 @@ public boolean hasAlternatingBits(int n) {
}
```
-## 求一个数的补码
+# 10. 求一个数的补码
[476. Number Complement (Easy)](https://leetcode.com/problems/number-complement/description/)
@@ -360,7 +351,7 @@ public int findComplement(int num) {
}
```
-## 实现整数的加法
+# 11. 实现整数的加法
[371. Sum of Two Integers (Easy)](https://leetcode.com/problems/sum-of-two-integers/description/)
@@ -374,7 +365,7 @@ public int getSum(int a, int b) {
}
```
-## 字符串数组最大乘积
+# 12. 字符串数组最大乘积
[318. Maximum Product of Word Lengths (Medium)](https://leetcode.com/problems/maximum-product-of-word-lengths/description/)
@@ -409,7 +400,7 @@ public int maxProduct(String[] words) {
}
```
-## 统计从 0 \~ n 每个数的二进制表示中 1 的个数
+# 13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数
[338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/)
diff --git a/notes/Leetcode 题解 - 图.md b/notes/Leetcode 题解 - 图.md
index a19adaad..c98d6b1f 100644
--- a/notes/Leetcode 题解 - 图.md
+++ b/notes/Leetcode 题解 - 图.md
@@ -1,11 +1,11 @@
* [二分图](#二分图)
- * [判断是否为二分图](#判断是否为二分图)
+ * [1. 判断是否为二分图](#1-判断是否为二分图)
* [拓扑排序](#拓扑排序)
- * [课程安排的合法性](#课程安排的合法性)
- * [课程安排的顺序](#课程安排的顺序)
+ * [1. 课程安排的合法性](#1-课程安排的合法性)
+ * [2. 课程安排的顺序](#2-课程安排的顺序)
* [并查集](#并查集)
- * [冗余连接](#冗余连接)
+ * [1. 冗余连接](#1-冗余连接)
@@ -13,7 +13,7 @@
如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点颜色不同,那么这个图就是二分图。
-## 判断是否为二分图
+## 1. 判断是否为二分图
[785. Is Graph Bipartite? (Medium)](https://leetcode.com/problems/is-graph-bipartite/description/)
@@ -72,7 +72,7 @@ private boolean isBipartite(int curNode, int curColor, int[] colors, int[][] gra
常用于在具有先序关系的任务规划中。
-## 课程安排的合法性
+## 1. 课程安排的合法性
[207. Course Schedule (Medium)](https://leetcode.com/problems/course-schedule/description/)
@@ -130,7 +130,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked,
}
```
-## 课程安排的顺序
+## 2. 课程安排的顺序
[210. Course Schedule II (Medium)](https://leetcode.com/problems/course-schedule-ii/description/)
@@ -193,7 +193,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked, List
-* [字符串循环移位包含](#字符串循环移位包含)
-* [字符串循环移位](#字符串循环移位)
-* [字符串中单词的翻转](#字符串中单词的翻转)
-* [两个字符串包含的字符是否完全相同](#两个字符串包含的字符是否完全相同)
-* [计算一组字符集合可以组成的回文字符串的最大长度](#计算一组字符集合可以组成的回文字符串的最大长度)
-* [字符串同构](#字符串同构)
-* [回文子字符串个数](#回文子字符串个数)
-* [判断一个整数是否是回文数](#判断一个整数是否是回文数)
-* [统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
+* [1. 字符串循环移位包含](#1-字符串循环移位包含)
+* [2. 字符串循环移位](#2-字符串循环移位)
+* [3. 字符串中单词的翻转](#3-字符串中单词的翻转)
+* [4. 两个字符串包含的字符是否完全相同](#4-两个字符串包含的字符是否完全相同)
+* [5. 计算一组字符集合可以组成的回文字符串的最大长度](#5-计算一组字符集合可以组成的回文字符串的最大长度)
+* [6. 字符串同构](#6-字符串同构)
+* [7. 回文子字符串个数](#7-回文子字符串个数)
+* [8. 判断一个整数是否是回文数](#8-判断一个整数是否是回文数)
+* [9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#9-统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
-# 字符串循环移位包含
+# 1. 字符串循环移位包含
[编程之美 3.1](#)
@@ -24,7 +24,7 @@ Return : true
s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。
-# 字符串循环移位
+# 2. 字符串循环移位
[编程之美 2.17](#)
@@ -37,7 +37,7 @@ Return "123abcd"
将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321,然后对整个字符串进行翻转,得到 123abcd。
-# 字符串中单词的翻转
+# 3. 字符串中单词的翻转
[程序员代码面试指南](#)
@@ -48,7 +48,7 @@ Return "student a am I"
将每个单词翻转,然后将整个字符串翻转。
-# 两个字符串包含的字符是否完全相同
+# 4. 两个字符串包含的字符是否完全相同
[242. Valid Anagram (Easy)](https://leetcode.com/problems/valid-anagram/description/)
@@ -79,7 +79,7 @@ public boolean isAnagram(String s, String t) {
}
```
-# 计算一组字符集合可以组成的回文字符串的最大长度
+# 5. 计算一组字符集合可以组成的回文字符串的最大长度
[409. Longest Palindrome (Easy)](https://leetcode.com/problems/longest-palindrome/description/)
@@ -110,7 +110,7 @@ public int longestPalindrome(String s) {
}
```
-# 字符串同构
+# 6. 字符串同构
[205. Isomorphic Strings (Easy)](https://leetcode.com/problems/isomorphic-strings/description/)
@@ -138,7 +138,7 @@ public boolean isIsomorphic(String s, String t) {
}
```
-# 回文子字符串个数
+# 7. 回文子字符串个数
[647. Palindromic Substrings (Medium)](https://leetcode.com/problems/palindromic-substrings/description/)
@@ -170,7 +170,7 @@ private void extendSubstrings(String s, int start, int end) {
}
```
-# 判断一个整数是否是回文数
+# 8. 判断一个整数是否是回文数
[9. Palindrome Number (Easy)](https://leetcode.com/problems/palindrome-number/description/)
@@ -195,7 +195,7 @@ public boolean isPalindrome(int x) {
}
```
-# 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
+# 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
[696. Count Binary Substrings (Easy)](https://leetcode.com/problems/count-binary-substrings/description/)
diff --git a/notes/Leetcode 题解 - 栈和队列.md b/notes/Leetcode 题解 - 栈和队列.md
index 912d9a60..997b70d2 100644
--- a/notes/Leetcode 题解 - 栈和队列.md
+++ b/notes/Leetcode 题解 - 栈和队列.md
@@ -1,14 +1,14 @@
-* [用栈实现队列](#用栈实现队列)
-* [用队列实现栈](#用队列实现栈)
-* [最小值栈](#最小值栈)
-* [用栈实现括号匹配](#用栈实现括号匹配)
-* [数组中元素与下一个比它大的元素之间的距离](#数组中元素与下一个比它大的元素之间的距离)
-* [循环数组中比当前元素大的下一个元素](#循环数组中比当前元素大的下一个元素)
+* [1. 用栈实现队列](#1-用栈实现队列)
+* [2. 用队列实现栈](#2-用队列实现栈)
+* [3. 最小值栈](#3-最小值栈)
+* [4. 用栈实现括号匹配](#4-用栈实现括号匹配)
+* [5. 数组中元素与下一个比它大的元素之间的距离](#5-数组中元素与下一个比它大的元素之间的距离)
+* [6. 循环数组中比当前元素大的下一个元素](#6-循环数组中比当前元素大的下一个元素)
-# 用栈实现队列
+# 1. 用栈实现队列
[232. Implement Queue using Stacks (Easy)](https://leetcode.com/problems/implement-queue-using-stacks/description/)
@@ -48,7 +48,7 @@ class MyQueue {
}
```
-# 用队列实现栈
+# 2. 用队列实现栈
[225. Implement Stack using Queues (Easy)](https://leetcode.com/problems/implement-stack-using-queues/description/)
@@ -85,7 +85,7 @@ class MyStack {
}
```
-# 最小值栈
+# 3. 最小值栈
[155. Min Stack (Easy)](https://leetcode.com/problems/min-stack/description/)
@@ -126,7 +126,7 @@ class MinStack {
对于实现最小值队列问题,可以先将队列使用栈来实现,然后就将问题转换为最小值栈,这个问题出现在 编程之美:3.7。
-# 用栈实现括号匹配
+# 4. 用栈实现括号匹配
[20. Valid Parentheses (Easy)](https://leetcode.com/problems/valid-parentheses/description/)
@@ -159,7 +159,7 @@ public boolean isValid(String s) {
}
```
-# 数组中元素与下一个比它大的元素之间的距离
+# 5. 数组中元素与下一个比它大的元素之间的距离
[739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/)
@@ -186,7 +186,7 @@ public int[] dailyTemperatures(int[] temperatures) {
}
```
-# 循环数组中比当前元素大的下一个元素
+# 6. 循环数组中比当前元素大的下一个元素
[503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/)
diff --git a/notes/Leetcode 题解 - 树.md b/notes/Leetcode 题解 - 树.md
index bc7d6c18..c98e7a3a 100644
--- a/notes/Leetcode 题解 - 树.md
+++ b/notes/Leetcode 题解 - 树.md
@@ -1,40 +1,40 @@
* [递归](#递归)
- * [树的高度](#树的高度)
- * [平衡树](#平衡树)
- * [两节点的最长路径](#两节点的最长路径)
- * [翻转树](#翻转树)
- * [归并两棵树](#归并两棵树)
- * [判断路径和是否等于一个数](#判断路径和是否等于一个数)
- * [统计路径和等于一个数的路径数量](#统计路径和等于一个数的路径数量)
- * [子树](#子树)
- * [树的对称](#树的对称)
- * [最小路径](#最小路径)
- * [统计左叶子节点的和](#统计左叶子节点的和)
- * [相同节点值的最大路径长度](#相同节点值的最大路径长度)
- * [间隔遍历](#间隔遍历)
- * [找出二叉树中第二小的节点](#找出二叉树中第二小的节点)
+ * [1. 树的高度](#1-树的高度)
+ * [2. 平衡树](#2-平衡树)
+ * [3. 两节点的最长路径](#3-两节点的最长路径)
+ * [4. 翻转树](#4-翻转树)
+ * [5. 归并两棵树](#5-归并两棵树)
+ * [6. 判断路径和是否等于一个数](#6-判断路径和是否等于一个数)
+ * [7. 统计路径和等于一个数的路径数量](#7-统计路径和等于一个数的路径数量)
+ * [8. 子树](#8-子树)
+ * [9. 树的对称](#9-树的对称)
+ * [10. 最小路径](#10-最小路径)
+ * [11. 统计左叶子节点的和](#11-统计左叶子节点的和)
+ * [12. 相同节点值的最大路径长度](#12-相同节点值的最大路径长度)
+ * [13. 间隔遍历](#13-间隔遍历)
+ * [14. 找出二叉树中第二小的节点](#14-找出二叉树中第二小的节点)
* [层次遍历](#层次遍历)
- * [一棵树每层节点的平均数](#一棵树每层节点的平均数)
- * [得到左下角的节点](#得到左下角的节点)
+ * [1. 一棵树每层节点的平均数](#1-一棵树每层节点的平均数)
+ * [2. 得到左下角的节点](#2-得到左下角的节点)
* [前中后序遍历](#前中后序遍历)
- * [非递归实现二叉树的前序遍历](#非递归实现二叉树的前序遍历)
- * [非递归实现二叉树的后序遍历](#非递归实现二叉树的后序遍历)
- * [非递归实现二叉树的中序遍历](#非递归实现二叉树的中序遍历)
+ * [1. 非递归实现二叉树的前序遍历](#1-非递归实现二叉树的前序遍历)
+ * [2. 非递归实现二叉树的后序遍历](#2-非递归实现二叉树的后序遍历)
+ * [3. 非递归实现二叉树的中序遍历](#3-非递归实现二叉树的中序遍历)
* [BST](#bst)
- * [修剪二叉查找树](#修剪二叉查找树)
- * [寻找二叉查找树的第 k 个元素](#寻找二叉查找树的第-k-个元素)
- * [把二叉查找树每个节点的值都加上比它大的节点的值](#把二叉查找树每个节点的值都加上比它大的节点的值)
- * [二叉查找树的最近公共祖先](#二叉查找树的最近公共祖先)
- * [二叉树的最近公共祖先](#二叉树的最近公共祖先)
- * [从有序数组中构造二叉查找树](#从有序数组中构造二叉查找树)
- * [根据有序链表构造平衡的二叉查找树](#根据有序链表构造平衡的二叉查找树)
- * [在二叉查找树中寻找两个节点,使它们的和为一个给定值](#在二叉查找树中寻找两个节点,使它们的和为一个给定值)
- * [在二叉查找树中查找两个节点之差的最小绝对值](#在二叉查找树中查找两个节点之差的最小绝对值)
- * [寻找二叉查找树中出现次数最多的值](#寻找二叉查找树中出现次数最多的值)
+ * [1. 修剪二叉查找树](#1-修剪二叉查找树)
+ * [2. 寻找二叉查找树的第 k 个元素](#2-寻找二叉查找树的第-k-个元素)
+ * [3. 把二叉查找树每个节点的值都加上比它大的节点的值](#3-把二叉查找树每个节点的值都加上比它大的节点的值)
+ * [4. 二叉查找树的最近公共祖先](#4-二叉查找树的最近公共祖先)
+ * [5. 二叉树的最近公共祖先](#5-二叉树的最近公共祖先)
+ * [6. 从有序数组中构造二叉查找树](#6-从有序数组中构造二叉查找树)
+ * [7. 根据有序链表构造平衡的二叉查找树](#7-根据有序链表构造平衡的二叉查找树)
+ * [8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值](#8-在二叉查找树中寻找两个节点,使它们的和为一个给定值)
+ * [9. 在二叉查找树中查找两个节点之差的最小绝对值](#9-在二叉查找树中查找两个节点之差的最小绝对值)
+ * [10. 寻找二叉查找树中出现次数最多的值](#10-寻找二叉查找树中出现次数最多的值)
* [Trie](#trie)
- * [实现一个 Trie](#实现一个-trie)
- * [实现一个 Trie,用来求前缀和](#实现一个-trie,用来求前缀和)
+ * [1. 实现一个 Trie](#1-实现一个-trie)
+ * [2. 实现一个 Trie,用来求前缀和](#2-实现一个-trie,用来求前缀和)
@@ -42,7 +42,7 @@
一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。
-## 树的高度
+## 1. 树的高度
[104. Maximum Depth of Binary Tree (Easy)](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/)
@@ -53,7 +53,7 @@ public int maxDepth(TreeNode root) {
}
```
-## 平衡树
+## 2. 平衡树
[110. Balanced Binary Tree (Easy)](https://leetcode.com/problems/balanced-binary-tree/description/)
@@ -84,7 +84,7 @@ public int maxDepth(TreeNode root) {
}
```
-## 两节点的最长路径
+## 3. 两节点的最长路径
[543. Diameter of Binary Tree (Easy)](https://leetcode.com/problems/diameter-of-binary-tree/description/)
@@ -117,7 +117,7 @@ private int depth(TreeNode root) {
}
```
-## 翻转树
+## 4. 翻转树
[226. Invert Binary Tree (Easy)](https://leetcode.com/problems/invert-binary-tree/description/)
@@ -131,7 +131,7 @@ public TreeNode invertTree(TreeNode root) {
}
```
-## 归并两棵树
+## 5. 归并两棵树
[617. Merge Two Binary Trees (Easy)](https://leetcode.com/problems/merge-two-binary-trees/description/)
@@ -164,7 +164,7 @@ public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
}
```
-## 判断路径和是否等于一个数
+## 6. 判断路径和是否等于一个数
[Leetcdoe : 112. Path Sum (Easy)](https://leetcode.com/problems/path-sum/description/)
@@ -192,7 +192,7 @@ public boolean hasPathSum(TreeNode root, int sum) {
}
```
-## 统计路径和等于一个数的路径数量
+## 7. 统计路径和等于一个数的路径数量
[437. Path Sum III (Easy)](https://leetcode.com/problems/path-sum-iii/description/)
@@ -232,7 +232,7 @@ private int pathSumStartWithRoot(TreeNode root, int sum) {
}
```
-## 子树
+## 8. 子树
[572. Subtree of Another Tree (Easy)](https://leetcode.com/problems/subtree-of-another-tree/description/)
@@ -283,7 +283,7 @@ private boolean isSubtreeWithRoot(TreeNode s, TreeNode t) {
}
```
-## 树的对称
+## 9. 树的对称
[101. Symmetric Tree (Easy)](https://leetcode.com/problems/symmetric-tree/description/)
@@ -309,7 +309,7 @@ private boolean isSymmetric(TreeNode t1, TreeNode t2) {
}
```
-## 最小路径
+## 10. 最小路径
[111. Minimum Depth of Binary Tree (Easy)](https://leetcode.com/problems/minimum-depth-of-binary-tree/description/)
@@ -325,7 +325,7 @@ public int minDepth(TreeNode root) {
}
```
-## 统计左叶子节点的和
+## 11. 统计左叶子节点的和
[404. Sum of Left Leaves (Easy)](https://leetcode.com/problems/sum-of-left-leaves/description/)
@@ -352,7 +352,7 @@ private boolean isLeaf(TreeNode node){
}
```
-## 相同节点值的最大路径长度
+## 12. 相同节点值的最大路径长度
[687. Longest Univalue Path (Easy)](https://leetcode.com/problems/longest-univalue-path/)
@@ -385,7 +385,7 @@ private int dfs(TreeNode root){
}
```
-## 间隔遍历
+## 13. 间隔遍历
[337. House Robber III (Medium)](https://leetcode.com/problems/house-robber-iii/description/)
@@ -409,7 +409,7 @@ public int rob(TreeNode root) {
}
```
-## 找出二叉树中第二小的节点
+## 14. 找出二叉树中第二小的节点
[671. Second Minimum Node In a Binary Tree (Easy)](https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/)
@@ -444,7 +444,7 @@ public int findSecondMinimumValue(TreeNode root) {
使用 BFS 进行层次遍历。不需要使用两个队列来分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。
-## 一棵树每层节点的平均数
+## 1. 一棵树每层节点的平均数
[637. Average of Levels in Binary Tree (Easy)](https://leetcode.com/problems/average-of-levels-in-binary-tree/description/)
@@ -469,7 +469,7 @@ public List averageOfLevels(TreeNode root) {
}
```
-## 得到左下角的节点
+## 2. 得到左下角的节点
[513. Find Bottom Left Tree Value (Easy)](https://leetcode.com/problems/find-bottom-left-tree-value/description/)
@@ -550,7 +550,7 @@ void dfs(TreeNode root) {
}
```
-## 非递归实现二叉树的前序遍历
+## 1. 非递归实现二叉树的前序遍历
[144. Binary Tree Preorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-preorder-traversal/description/)
@@ -570,7 +570,7 @@ public List preorderTraversal(TreeNode root) {
}
```
-## 非递归实现二叉树的后序遍历
+## 2. 非递归实现二叉树的后序遍历
[145. Binary Tree Postorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-postorder-traversal/description/)
@@ -593,7 +593,7 @@ public List postorderTraversal(TreeNode root) {
}
```
-## 非递归实现二叉树的中序遍历
+## 3. 非递归实现二叉树的中序遍历
[94. Binary Tree Inorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-inorder-traversal/description/)
@@ -622,7 +622,7 @@ public List inorderTraversal(TreeNode root) {
二叉查找树中序遍历有序。
-## 修剪二叉查找树
+## 1. 修剪二叉查找树
[669. Trim a Binary Search Tree (Easy)](https://leetcode.com/problems/trim-a-binary-search-tree/description/)
@@ -662,7 +662,7 @@ public TreeNode trimBST(TreeNode root, int L, int R) {
}
```
-## 寻找二叉查找树的第 k 个元素
+## 2. 寻找二叉查找树的第 k 个元素
[230. Kth Smallest Element in a BST (Medium)](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/)
@@ -706,7 +706,7 @@ private int count(TreeNode node) {
}
```
-## 把二叉查找树每个节点的值都加上比它大的节点的值
+## 3. 把二叉查找树每个节点的值都加上比它大的节点的值
[Convert BST to Greater Tree (Easy)](https://leetcode.com/problems/convert-bst-to-greater-tree/description/)
@@ -743,7 +743,7 @@ private void traver(TreeNode node) {
}
```
-## 二叉查找树的最近公共祖先
+## 4. 二叉查找树的最近公共祖先
[235. Lowest Common Ancestor of a Binary Search Tree (Easy)](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
@@ -767,7 +767,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
-## 二叉树的最近公共祖先
+## 5. 二叉树的最近公共祖先
[236. Lowest Common Ancestor of a Binary Tree (Medium) ](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
@@ -792,7 +792,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
-## 从有序数组中构造二叉查找树
+## 6. 从有序数组中构造二叉查找树
[108. Convert Sorted Array to Binary Search Tree (Easy)](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/)
@@ -811,7 +811,7 @@ private TreeNode toBST(int[] nums, int sIdx, int eIdx){
}
```
-## 根据有序链表构造平衡的二叉查找树
+## 7. 根据有序链表构造平衡的二叉查找树
[109. Convert Sorted List to Binary Search Tree (Medium)](https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/)
@@ -852,7 +852,7 @@ private ListNode preMid(ListNode head) {
}
```
-## 在二叉查找树中寻找两个节点,使它们的和为一个给定值
+## 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值
[653. Two Sum IV - Input is a BST (Easy)](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/description/)
@@ -896,7 +896,7 @@ private void inOrder(TreeNode root, List nums) {
}
```
-## 在二叉查找树中查找两个节点之差的最小绝对值
+## 9. 在二叉查找树中查找两个节点之差的最小绝对值
[530. Minimum Absolute Difference in BST (Easy)](https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/)
@@ -934,7 +934,7 @@ private void inOrder(TreeNode node) {
}
```
-## 寻找二叉查找树中出现次数最多的值
+## 10. 寻找二叉查找树中出现次数最多的值
[501. Find Mode in Binary Search Tree (Easy)](https://leetcode.com/problems/find-mode-in-binary-search-tree/description/)
@@ -991,7 +991,7 @@ private void inOrder(TreeNode node, List nums) {
Trie,又称前缀树或字典树,用于判断字符串是否存在或者是否具有某种字符串前缀。
-## 实现一个 Trie
+## 1. 实现一个 Trie
[208. Implement Trie (Prefix Tree) (Medium)](https://leetcode.com/problems/implement-trie-prefix-tree/description/)
@@ -1053,7 +1053,7 @@ class Trie {
}
```
-## 实现一个 Trie,用来求前缀和
+## 2. 实现一个 Trie,用来求前缀和
[677. Map Sum Pairs (Medium)](https://leetcode.com/problems/map-sum-pairs/description/)
diff --git a/notes/Leetcode 题解 - 链表.md b/notes/Leetcode 题解 - 链表.md
index 7b2c16ff..e6a5f4ae 100644
--- a/notes/Leetcode 题解 - 链表.md
+++ b/notes/Leetcode 题解 - 链表.md
@@ -1,20 +1,20 @@
-* [找出两个链表的交点](#找出两个链表的交点)
-* [链表反转](#链表反转)
-* [归并两个有序的链表](#归并两个有序的链表)
-* [从有序链表中删除重复节点](#从有序链表中删除重复节点)
-* [删除链表的倒数第 n 个节点](#删除链表的倒数第-n-个节点)
-* [交换链表中的相邻结点](#交换链表中的相邻结点)
-* [链表求和](#链表求和)
-* [回文链表](#回文链表)
-* [分隔链表](#分隔链表)
-* [链表元素按奇偶聚集](#链表元素按奇偶聚集)
+* [1. 找出两个链表的交点](#1-找出两个链表的交点)
+* [2. 链表反转](#2-链表反转)
+* [3. 归并两个有序的链表](#3-归并两个有序的链表)
+* [4. 从有序链表中删除重复节点](#4-从有序链表中删除重复节点)
+* [5. 删除链表的倒数第 n 个节点](#5-删除链表的倒数第-n-个节点)
+* [6. 交换链表中的相邻结点](#6-交换链表中的相邻结点)
+* [7. 链表求和](#7-链表求和)
+* [8. 回文链表](#8-回文链表)
+* [9. 分隔链表](#9-分隔链表)
+* [10. 链表元素按奇偶聚集](#10-链表元素按奇偶聚集)
链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。
-# 找出两个链表的交点
+# 1. 找出两个链表的交点
[160. Intersection of Two Linked Lists (Easy)](https://leetcode.com/problems/intersection-of-two-linked-lists/description/)
@@ -48,7 +48,7 @@ public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
- 把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;
- 或者直接比较两个链表的最后一个节点是否相同。
-# 链表反转
+# 2. 链表反转
[206. Reverse Linked List (Easy)](https://leetcode.com/problems/reverse-linked-list/description/)
@@ -82,7 +82,7 @@ public ListNode reverseList(ListNode head) {
}
```
-# 归并两个有序的链表
+# 3. 归并两个有序的链表
[21. Merge Two Sorted Lists (Easy)](https://leetcode.com/problems/merge-two-sorted-lists/description/)
@@ -100,7 +100,7 @@ public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
}
```
-# 从有序链表中删除重复节点
+# 4. 从有序链表中删除重复节点
[83. Remove Duplicates from Sorted List (Easy)](https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/)
@@ -117,7 +117,7 @@ public ListNode deleteDuplicates(ListNode head) {
}
```
-# 删除链表的倒数第 n 个节点
+# 5. 删除链表的倒数第 n 个节点
[19. Remove Nth Node From End of List (Medium)](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)
@@ -143,7 +143,7 @@ public ListNode removeNthFromEnd(ListNode head, int n) {
}
```
-# 交换链表中的相邻结点
+# 6. 交换链表中的相邻结点
[24. Swap Nodes in Pairs (Medium)](https://leetcode.com/problems/swap-nodes-in-pairs/description/)
@@ -171,7 +171,7 @@ public ListNode swapPairs(ListNode head) {
}
```
-# 链表求和
+# 7. 链表求和
[445. Add Two Numbers II (Medium)](https://leetcode.com/problems/add-two-numbers-ii/description/)
@@ -210,7 +210,7 @@ private Stack buildStack(ListNode l) {
}
```
-# 回文链表
+# 8. 回文链表
[234. Palindrome Linked List (Easy)](https://leetcode.com/problems/palindrome-linked-list/description/)
@@ -259,7 +259,7 @@ private boolean isEqual(ListNode l1, ListNode l2) {
}
```
-# 分隔链表
+# 9. 分隔链表
[725. Split Linked List in Parts(Medium)](https://leetcode.com/problems/split-linked-list-in-parts/description/)
@@ -299,7 +299,7 @@ public ListNode[] splitListToParts(ListNode root, int k) {
}
```
-# 链表元素按奇偶聚集
+# 10. 链表元素按奇偶聚集
[328. Odd Even Linked List (Medium)](https://leetcode.com/problems/odd-even-linked-list/description/)