File tree 1 file changed +0
-12
lines changed
solution/0600-0699/0645.Set Mismatch
1 file changed +0
-12
lines changed Original file line number Diff line number Diff line change 43
43
44
44
** 方法一:数学**
45
45
46
- <<<<<<< HEAD
47
- 首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素以及 ` i∈[1, n] ` 所有数字进行异或运算,这样可以消除出现两次的数字,只留下缺失的数字和重复的数字,即 ` eor = a ^ b ` 。
48
-
49
- 使用按位与运算符 ` & ` 和取反运算符 ` ~ ` ,从异或结果 eor 中找到最右边的` 置位位 ` (在二进制表示中从右向左数的第一个为1的位)用来区分缺失数字和重复数字的位置,即 ` eor & (~eor + 1) `
50
-
51
- 之后遍历数组所有元素以及 ` i∈[1, n] ` 所有数字,根据` 置位位 ` 将数字分为两组,一组是在置位位上为 0 的数字,另一组是在置位位上为 1 的数字, 二进制位为 0 的元素异或到 ` a ` ,即缺失的数字。
52
-
53
- 遍历结束后 ` b = eor ^ a ` ,` b ` 即重复的数字,返回结果即可。
54
-
55
- 时间复杂度 ` O(n) ` , 位运算解法空间复杂度 ` O(1) ` 。
56
- =======
57
46
我们用 $s_1$ 表示 $[ 1,..n] $ 所有数字的和,用 $s_2$ 表示数组 $nums$ 去重后的数字和,用 $s$ 表示数组 $nums$ 的数字和。
58
47
59
48
那么 $s - s_2$ 就是重复的数字,而 $s_1 - s_2$ 就是缺失的数字。
77
66
接下来我们只需要判断 $a$ 和 $b$ 哪个数字是重复的数字,哪个数字是缺失的数字即可。因此,遍历数组 $nums$,对于遍历到的数字 $x$,如果 $x=a$,那么 $a$ 就是重复的数字,返回 $[ a, b] $,否则遍历结束,返回 $[ b, a] $。
78
67
79
68
时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$,仅使用常数大小的额外空间。
80
- >>>>>>> upstream/main
81
69
82
70
<!-- tabs:start -->
83
71
You can’t perform that action at this time.
0 commit comments