From cb20aadfef35a557d3309e0f2e6f23ca64275fd8 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Tue, 14 May 2019 22:56:30 +0800 Subject: [PATCH] auto commit --- docs/notes/Leetcode 题解 - 二分查找.md | 45 ++++----- docs/notes/Leetcode 题解 - 位运算.md | 67 ++++++------- docs/notes/Leetcode 题解 - 图.md | 16 ++-- docs/notes/Leetcode 题解 - 字符串.md | 36 +++---- docs/notes/Leetcode 题解 - 栈和队列.md | 24 ++--- docs/notes/Leetcode 题解 - 树.md | 124 ++++++++++++------------- docs/notes/Leetcode 题解 - 链表.md | 40 ++++---- notes/Leetcode 题解 - 二分查找.md | 45 ++++----- notes/Leetcode 题解 - 位运算.md | 67 ++++++------- notes/Leetcode 题解 - 图.md | 16 ++-- notes/Leetcode 题解 - 字符串.md | 36 +++---- notes/Leetcode 题解 - 栈和队列.md | 24 ++--- notes/Leetcode 题解 - 树.md | 124 ++++++++++++------------- notes/Leetcode 题解 - 链表.md | 40 ++++---- 14 files changed, 332 insertions(+), 372 deletions(-) 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/)