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