diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md
index aa6ac568..4851618c 100644
--- a/notes/剑指 offer 题解.md
+++ b/notes/剑指 offer 题解.md
@@ -17,7 +17,6 @@
* [13. 机器人的运动范围](#13-机器人的运动范围)
* [14. 剪绳子](#14-剪绳子)
* [15. 二进制中 1 的个数](#15-二进制中-1-的个数)
-* [高质量的代码](#高质量的代码)
* [16. 数值的整数次方](#16-数值的整数次方)
* [17. 打印从 1 到最大的 n 位数](#17-打印从-1-到最大的-n-位数)
* [18.1 在 O(1) 时间内删除链表节点](#181-在-o1-时间内删除链表节点)
@@ -30,7 +29,6 @@
* [24. 反转链表](#24-反转链表)
* [25. 合并两个排序的链表](#25-合并两个排序的链表)
* [26. 树的子结构](#26-树的子结构)
-* [解决面试题的思路](#解决面试题的思路)
* [27. 二叉树的镜像](#27-二叉树的镜像)
* [28.1 对称的二叉树](#281-对称的二叉树)
* [28.2 平衡二叉树](#282-平衡二叉树)
@@ -46,7 +44,6 @@
* [36. 二叉搜索树与双向链表](#36-二叉搜索树与双向链表)
* [37. 序列化二叉树](#37-序列化二叉树)
* [38. 字符串的排列](#38-字符串的排列)
-* [优化时间和空间效率](#优化时间和空间效率)
* [39. 数组中出现次数超过一半的数字](#39-数组中出现次数超过一半的数字)
* [40. 最小的 K 个数](#40-最小的-k-个数)
* [41.1 数据流中的中位数](#411-数据流中的中位数)
@@ -57,14 +54,14 @@
* [45. 把数组排成最小的数](#45-把数组排成最小的数)
* [46. 把数字翻译成字符串](#46-把数字翻译成字符串)
* [47. 礼物的最大价值](#47-礼物的最大价值)
-* [解题思路](#解题思路)
* [48. 最长不含重复字符的子字符串](#48-最长不含重复字符的子字符串)
+* [49. 丑数](#49-丑数)
* [50. 第一个只出现一次的字符位置](#50-第一个只出现一次的字符位置)
* [52. 两个链表的第一个公共结点](#52-两个链表的第一个公共结点)
-* [面试中的各项能力](#面试中的各项能力)
* [53 数字在排序数组中出现的次数](#53-数字在排序数组中出现的次数)
* [54. 二叉搜索树的第 k 个结点](#54-二叉搜索树的第-k-个结点)
* [55 二叉树的深度](#55-二叉树的深度)
+* [56. 数组中只出现一次的数字](#56-数组中只出现一次的数字)
* [57.1 和为 S 的两个数字](#571-和为-s-的两个数字)
* [57.2 和为 S 的连续正数序列](#572-和为-s-的连续正数序列)
* [58.1 翻转单词顺序列](#581-翻转单词顺序列)
@@ -75,8 +72,8 @@
* [62. 圆圈中最后剩下的数](#62-圆圈中最后剩下的数)
* [63. 股票的最大利润](#63-股票的最大利润)
* [64. 求 1+2+3+...+n](#64-求-1+2+3++n)
+* [65. 不用加减乘除做加法](#65-不用加减乘除做加法)
* [66. 构建乘积数组](#66-构建乘积数组)
-* [两个面试案例](#两个面试案例)
* [67. 把字符串转换成整数](#67-把字符串转换成整数)
* [68. 树中两个节点的最低公共祖先](#68-树中两个节点的最低公共祖先)
@@ -101,7 +98,7 @@ O(nlogn) + O(n2),第一个指时间复杂度,第二个
# 2. 实现 Singleton
-[单例模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F)
+[单例模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#%E5%8D%95%E4%BB%B6%E6%A8%A1%E5%BC%8F)
# 3. 数组中重复的数字
@@ -523,7 +520,7 @@ public int RectCover(int n) {
## 解题思路
-#### 分治
+### 分治
复杂度:O(logn) + O(1),其实空间复杂度不止 O(1),因为分治使用了递归栈,用到了额外的空间,如果对空间有要求就不能用这种方法。
@@ -540,7 +537,7 @@ private int minNumberInRotateArray(int[] nums, int first, int last) {
}
```
-#### 双指针
+### 双指针
复杂度:O(logn) + O(1)
@@ -662,11 +659,11 @@ private void initDigitSum(int rows, int cols) {
## 解题思路
-#### 1. 动态规划解法
+### 动态规划解法
[分割整数](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3.md#%E5%88%86%E5%89%B2%E6%95%B4%E6%95%B0)
-#### 2. 贪心解法
+### 贪心解法
尽可能多得剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现,如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。
@@ -711,8 +708,6 @@ public int NumberOf1(int n) {
}
```
-# 高质量的代码
-
# 16. 数值的整数次方
## 题目描述
@@ -1055,8 +1050,6 @@ private boolean isSubtree(TreeNode root1, TreeNode root2) {
}
```
-# 解决面试题的思路
-
# 27. 二叉树的镜像
## 题目描述
@@ -1516,8 +1509,6 @@ private void backtracking(char[] chars, boolean[] hasUsed, StringBuffer s) {
}
```
-# 优化时间和空间效率
-
# 39. 数组中出现次数超过一半的数字
## 解题思路
@@ -1844,7 +1835,7 @@ public int getTranslationCount(String number) {
礼物的最大价值为 1+12+5+7+7+16+5=53。
-# 解题思路
+## 解题思路
应该用动态规划求解,而不是深度优先搜索,深度优先搜索过于复杂,不是最优解。
@@ -1890,7 +1881,7 @@ public int longestSubStringWithoutDuplication(String str) {
}
```
-## 49. 丑数
+# 49. 丑数
## 题目描述
@@ -1997,8 +1988,6 @@ public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
}
```
-# 面试中的各项能力
-
# 53 数字在排序数组中出现的次数
## 题目描述
@@ -2078,7 +2067,7 @@ public int TreeDepth(TreeNode root) {
}
```
-## 56. 数组中只出现一次的数字
+# 56. 数组中只出现一次的数字
## 题目描述
@@ -2389,7 +2378,7 @@ public int Sum_Solution(int n) {
}
```
-## 65. 不用加减乘除做加法
+# 65. 不用加减乘除做加法
a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。
@@ -2420,8 +2409,6 @@ public int[] multiply(int[] A) {
}
```
-# 两个面试案例
-
# 67. 把字符串转换成整数
```java