2222
2323## 哈希判重
2424
25- 空间复杂度O(N),违反了` 只能使用额外的 O(1) 的空间 ` 。
25+ 空间复杂度O(N),违反了` 只能使用额外的 O(1) 的空间 ` 的限制 。
2626
27- ## 抽屉原理
28-
29- 数组中只有一个重复的数字,但它可能不止重复出现一次。
3027
31- 把所有元素放在他的下标处,遇到位置已经被占用的就是所得元素。
32-
33- 但是,违反了` 不能更改原数组(假设数组是只读的) ` 。
3428
3529## 求和
3630
3731本题只有一个重复元素,但是重复次数不确定,不能求和
3832
33+
34+
3935## 位运算
4036
4137根据两个相同元素异或结果为0
4238
4339重复次数不一定为偶数,不能使用异或
4440
41+
42+
4543## 先排序,再比较相邻元素
4644
4745改变了原数组
@@ -55,25 +53,41 @@ var findDuplicate = function (nums) {
5553};
5654```
5755
58- ## 二分法(分治 + 抽屉原理)
56+
57+
58+ ## 抽屉原理
59+
60+ 数组中只有一个重复的数字,但它可能不止重复出现一次。
61+
62+ 把所有元素放在他的下标处,遇到位置已经被占用的就是所得元素。
63+
64+ 但是,违反了` 不能更改原数组(假设数组是只读的) ` 。
65+
66+
67+
68+ ## 二分查找
69+
70+
5971
6072这道题目主要应用了抽屉原理和分治的思想。
6173
6274抽屉原理:n+1 个苹果放在 n 个抽屉里,那么至少有一个抽屉中会放两个苹果。
6375
6476用在这个题目中就是,一共有 n+1 个数,每个数的取值范围是1到n,所以至少会有一个数出现两次。
6577
66- 然后用分治的思想,将数的取值范围[ 1, n] 划分成[ 1, n/2] 和 [ n/2+1, n] 两个子区间,然后分别统计两个区间中数的个数。
78+ 然后用分治的思想,将数的取值范围` [1, n] ` 划分成` [1, n/2] ` 和 ` [n/2+1, n] ` 两个子区间,然后分别统计两个区间中数的个数。
6779
68- 如果[ 1, n/2] 中数的个数超过区间长度,结果就在这个区间中,否则在[ n/2+1, n] 区间中
80+ 如果` [1, n/2] ` 中数的个数超过区间长度,结果就在这个区间中,否则在` [n/2+1, n] ` 区间中
6981
7082依次类推,每次我们可以把区间长度缩小一半,直到区间长度为1时,我们就找到了答案。
7183
72- 复杂度分析
7384
74- 时间复杂度:每次会将区间长度缩小一半,一共会缩小 O(logn) 次。每次统计两个子区间中的数时需要遍历整个数组,时间复杂度是 O(n)。所以总时间复杂度是 O(nlogn)。
7585
76- 空间复杂度:代码中没有用到额外的数组,所以额外的空间复杂度是 O(1)。
86+ #### 复杂度分析
87+
88+ 时间复杂度:每次会将区间长度缩小一半,一共会缩小 ` O(logn) ` 次。每次统计两个子区间中的数时需要遍历整个数组,时间复杂度是 ` O(n) ` 。所以总时间复杂度是 ` O(nlogn) ` 。
89+
90+ 空间复杂度:代码中没有用到额外的数组,所以额外的空间复杂度是 ` O(1) ` 。
7791
7892``` cpp
7993class Solution {
0 commit comments