26
26
27
27
<!-- 这里可写通用的实现逻辑 -->
28
28
29
- 1 . 排序
30
- - 排序 ` nums ` ,检查 ` nums[i] == i ` ,返回条件不成立的 ` i ` 。
31
- - 若全部符合条件,则返回 ` nums.length ` 。
32
- 2 . 数学
33
- - 遍历 ` nums ` ,统计总和,并记录其中的最大值。
34
- - 若最大值与 ` nums.length ` 一致,使用高斯算法(` (n + 1) * n / 2 ` )计算总和,与遍历总和相减,得到结果。
35
- - 不一致,则缺失的就是 ` nums.length ` 。
36
- 3 . 位运算
37
- - 利用异或的特性,` res = res ^ x ^ x ` 。对同一个值异或两次,结果等于它本身。最后异或的结果,就是只出现一次的数字,即数组中缺失的整数。
29
+ ** 方法一:排序**
30
+
31
+ 我们可以先对数组 $nums$ 进行排序,然后遍历排序后的数组,判断当前元素是否等于其下标,若不等,则返回下标即可。
32
+
33
+ 否则遍历结束后,返回数组长度即可。
34
+
35
+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组 $nums$ 的长度。
36
+
37
+ ** 方法二:求和**
38
+
39
+ 我们可以先求出 $0$ 到 $n$ 的和,然后遍历数组 $nums$,将数组中的元素依次减去,最后剩下的值即为缺失的数字。
40
+
41
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
42
+
43
+ ** 方法三:位运算**
44
+
45
+ 我们可以使用异或运算,将 $0$ 到 $n$ 的所有数与数组 $nums$ 中的数进行异或运算,最后剩下的值即为缺失的数字。
46
+
47
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
38
48
39
49
<!-- tabs:start -->
40
50
45
55
``` python
46
56
class Solution :
47
57
def missingNumber (self , nums : List[int ]) -> int :
48
- res = 0
49
- for i, num in enumerate (nums):
50
- res = res ^ num ^ (i + 1 )
51
- return res
58
+ nums.sort()
59
+ for i, x in enumerate (nums):
60
+ if i != x:
61
+ return i
62
+ return len (nums)
63
+ ```
64
+
65
+ ``` python
66
+ class Solution :
67
+ def missingNumber (self , nums : List[int ]) -> int :
68
+ return sum (range (len (nums) + 1 )) - sum (nums)
69
+ ```
70
+
71
+ ``` python
72
+ class Solution :
73
+ def missingNumber (self , nums : List[int ]) -> int :
74
+ ans = 0
75
+ for i, x in enumerate (nums, 1 ):
76
+ ans ^= i ^ x
77
+ return ans
52
78
```
53
79
54
80
### ** Java**
@@ -58,12 +84,118 @@ class Solution:
58
84
``` java
59
85
class Solution {
60
86
public int missingNumber (int [] nums ) {
61
- int res = 0 ;
62
- for (int i = 0 ; i < nums. length; ++ i) {
63
- res = res ^ nums[i] ^ (i + 1 );
87
+ Arrays . sort(nums);
88
+ int n = nums. length;
89
+ for (int i = 0 ; i < n; ++ i) {
90
+ if (i != nums[i]) {
91
+ return i;
92
+ }
93
+ }
94
+ return n;
95
+ }
96
+ }
97
+ ```
98
+
99
+ ``` java
100
+ class Solution {
101
+ public int missingNumber (int [] nums ) {
102
+ int n = nums. length;
103
+ int ans = n;
104
+ for (int i = 0 ; i < n; ++ i) {
105
+ ans += i - nums[i];
106
+ }
107
+ return ans;
108
+ }
109
+ }
110
+ ```
111
+
112
+ ``` java
113
+ class Solution {
114
+ public int missingNumber (int [] nums ) {
115
+ int ans = 0 ;
116
+ for (int i = 1 ; i <= nums. length; ++ i) {
117
+ ans ^ = i ^ nums[i - 1 ];
118
+ }
119
+ return ans;
120
+ }
121
+ }
122
+ ```
123
+
124
+ ### ** C++**
125
+
126
+ ``` cpp
127
+ class Solution {
128
+ public:
129
+ int missingNumber(vector<int >& nums) {
130
+ sort(nums.begin(), nums.end());
131
+ int n = nums.size();
132
+ for (int i = 0; i < n; ++i) {
133
+ if (i != nums[ i] ) {
134
+ return i;
135
+ }
64
136
}
65
- return res ;
137
+ return n ;
66
138
}
139
+ };
140
+ ```
141
+
142
+ ```cpp
143
+ class Solution {
144
+ public:
145
+ int missingNumber(vector<int>& nums) {
146
+ int n = nums.size();
147
+ int ans = n;
148
+ for (int i = 0; i < n; ++i) {
149
+ ans += i - nums[i];
150
+ }
151
+ return ans;
152
+ }
153
+ };
154
+ ```
155
+
156
+ ``` cpp
157
+ class Solution {
158
+ public:
159
+ int missingNumber(vector<int >& nums) {
160
+ int ans = 0;
161
+ for (int i = 1; i <= nums.size(); ++i) {
162
+ ans ^= i ^ nums[ i - 1] ;
163
+ }
164
+ return ans;
165
+ }
166
+ };
167
+ ```
168
+
169
+ ### **Go**
170
+
171
+ ```go
172
+ func missingNumber(nums []int) int {
173
+ sort.Ints(nums)
174
+ for i, x := range nums {
175
+ if i != x {
176
+ return i
177
+ }
178
+ }
179
+ return len(nums)
180
+ }
181
+ ```
182
+
183
+ ``` go
184
+ func missingNumber (nums []int ) (ans int ) {
185
+ ans = len (nums)
186
+ for i , x := range nums {
187
+ ans += i - x
188
+ }
189
+ return
190
+ }
191
+ ```
192
+
193
+ ``` go
194
+ func missingNumber (nums []int ) (ans int ) {
195
+ for i , x := range nums {
196
+ ans ^= (i + 1 ) ^ x
197
+ }
198
+ return
67
199
}
68
200
```
69
201
@@ -75,26 +207,43 @@ class Solution {
75
207
* @return {number}
76
208
*/
77
209
var missingNumber = function (nums ) {
78
- let res;
79
- for (let i = 0 ; i < nums .length ; i++ ) {
80
- res = res ^ nums[i] ^ (i + 1 );
210
+ nums .sort ((a , b ) => a - b);
211
+ const n = nums .length ;
212
+ for (let i = 0 ; i < n; ++ i) {
213
+ if (i != nums[i]) {
214
+ return i;
215
+ }
81
216
}
82
- return res ;
217
+ return n ;
83
218
};
84
219
```
85
220
86
- ### ** C++**
221
+ ``` js
222
+ /**
223
+ * @param {number[]} nums
224
+ * @return {number}
225
+ */
226
+ var missingNumber = function (nums ) {
227
+ const n = nums .length ;
228
+ let ans = n;
229
+ for (let i = 0 ; i < n; ++ i) {
230
+ ans += i - nums[i];
231
+ }
232
+ return ans;
233
+ };
234
+ ```
87
235
88
- ``` cpp
89
- class Solution {
90
- public:
91
- int missingNumber(vector< int >& nums) {
92
- int res = 0;
93
- for (int i = 0; i < nums.size(); ++i ) {
94
- res = res ^ nums [ i ] ^ (i + 1) ;
95
- }
96
- return res ;
236
+ ``` js
237
+ /**
238
+ * @param {number[]} nums
239
+ * @return {number}
240
+ */
241
+ var missingNumber = function ( nums ) {
242
+ let ans = 0 ;
243
+ for ( let i = 1 ; i <= nums . length ; ++ i) {
244
+ ans ^= i ^ nums[i - 1 ] ;
97
245
}
246
+ return ans;
98
247
};
99
248
```
100
249
0 commit comments