Skip to content

Commit a0c9b80

Browse files
committed
feat: add solutions to lcof problem: No.53.2
1 parent 97ae084 commit a0c9b80

File tree

8 files changed

+140
-133
lines changed

8 files changed

+140
-133
lines changed

lcof/面试题53 - II. 0~n-1中缺失的数字/README.md

+84-74
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,15 @@
2525

2626
## 解法
2727

28-
二分法。
28+
**方法一:二分查找**
29+
30+
我们可以使用二分查找的方法找到这个缺失的数字。初始化左边界 $l=0$,右边界 $r=n$,其中 $n$ 是数组的长度。
31+
32+
每次计算中间元素的下标 $mid$,如果 $nums[mid] \gt mid$,则缺失的数字一定在区间 $[l,..mid]$ 中,否则缺失的数字一定在区间 $[mid+1,..r]$ 中。
33+
34+
最后返回左边界 $l$ 即可。
35+
36+
时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 是数组的长度。
2937

3038
<!-- tabs:start -->
3139

@@ -34,42 +42,69 @@
3442
```python
3543
class Solution:
3644
def missingNumber(self, nums: List[int]) -> int:
37-
l, r = 0, len(nums) - 1
38-
if r == 0 or nums[0] == 1:
39-
return nums[0] ^ 1
40-
if nums[r] == r:
41-
return r + 1
42-
while r - l > 1:
43-
m = (l + r) >> 1
44-
if nums[m] == m:
45-
l = m
45+
l, r = 0, len(nums)
46+
while l < r:
47+
mid = (l + r) >> 1
48+
if nums[mid] > mid:
49+
r = mid
4650
else:
47-
r = m
48-
return nums[r] - 1
51+
l = mid + 1
52+
return l
4953
```
5054

5155
### **Java**
5256

5357
```java
5458
class Solution {
5559
public int missingNumber(int[] nums) {
56-
int l = 0, r = nums.length - 1;
57-
if (r == 0 || nums[0] == 1) {
58-
return nums[0] ^ 1;
59-
}
60-
if (nums[r] == r) {
61-
return r + 1;
60+
int l = 0, r = nums.length;
61+
while (l < r) {
62+
int mid = (l + r) >>> 1;
63+
if (nums[mid] > mid) {
64+
r = mid;
65+
} else {
66+
l = mid + 1;
67+
}
6268
}
63-
while (r - l > 1) {
64-
int m = (l + r) >>> 1;
65-
if (nums[m] == m) {
66-
l = m;
69+
return l;
70+
}
71+
}
72+
```
73+
74+
### **C++**
75+
76+
```cpp
77+
class Solution {
78+
public:
79+
int missingNumber(vector<int>& nums) {
80+
int l = 0, r = nums.size();
81+
while (l < r) {
82+
int mid = (l + r) >> 1;
83+
if (nums[mid] > mid) {
84+
r = mid;
6785
} else {
68-
r = m;
86+
l = mid + 1;
6987
}
7088
}
71-
return nums[r] - 1;
89+
return l;
7290
}
91+
};
92+
```
93+
94+
### **Go**
95+
96+
```go
97+
func missingNumber(nums []int) int {
98+
l, r := 0, len(nums)
99+
for l < r {
100+
mid := (l + r) >> 1
101+
if nums[mid] > mid {
102+
r = mid
103+
} else {
104+
l = mid + 1
105+
}
106+
}
107+
return l
73108
}
74109
```
75110

@@ -81,43 +116,39 @@ class Solution {
81116
* @return {number}
82117
*/
83118
var missingNumber = function (nums) {
84-
if (!nums || !nums.length) return 0;
85-
let left = 0;
86-
let right = nums.length - 1;
87-
while (left < right) {
88-
let mid = left + ~~((right - left) / 2);
89-
if (nums[mid] !== mid) {
90-
right = mid;
119+
let l = 0;
120+
let r = nums.length;
121+
while (l < r) {
122+
const mid = (l + r) >> 1;
123+
if (nums[mid] > mid) {
124+
r = mid;
91125
} else {
92-
left = mid + 1;
126+
l = mid + 1;
93127
}
94128
}
95-
return nums[left] === left ? nums.length : left;
129+
return l;
96130
};
97131
```
98132

99-
### **C++**
133+
### **Rust**
100134

101-
```cpp
102-
class Solution {
103-
public:
104-
int missingNumber(vector<int>& nums) {
105-
int left = 0, right = nums.size();
106-
while (left < right) {
107-
int mid = left + (right - left) / 2;
108-
if (nums[mid] == mid) {
109-
left = mid + 1;
135+
```rust
136+
impl Solution {
137+
pub fn missing_number(nums: Vec<i32>) -> i32 {
138+
let (mut l, mut r) = (0, nums.len() as i32);
139+
while l < r {
140+
let mut mid = (l + r) >> 1;
141+
if nums[mid as usize] > mid {
142+
r = mid;
110143
} else {
111-
right = mid;
144+
l = mid + 1;
112145
}
113146
}
114-
return left;
147+
l
115148
}
116-
};
149+
}
117150
```
118151

119-
### **Rust**
120-
121152
```rust
122153
impl Solution {
123154
pub fn missing_number(nums: Vec<i32>) -> i32 {
@@ -131,42 +162,21 @@ impl Solution {
131162
}
132163
```
133164

134-
```rust
135-
impl Solution {
136-
pub fn missing_number(nums: Vec<i32>) -> i32 {
137-
let mut prev = 0;
138-
for &num in nums.iter() {
139-
if prev != num {
140-
return prev;
141-
}
142-
prev += 1;
143-
}
144-
prev
145-
}
146-
}
147-
```
148-
149165
### **C#**
150166

151167
```cs
152168
public class Solution {
153169
public int MissingNumber(int[] nums) {
154-
int l = 0, r = nums.Length - 1;
155-
if (r == 0 || nums[0] == 1) {
156-
return nums[0] ^ 1;
157-
}
158-
if (nums[r] == r) {
159-
return r + 1;
160-
}
170+
int l = 0, r = nums.Length;
161171
while (l < r) {
162172
int mid = (l + r) >> 1;
163-
if (nums[mid] == mid) {
164-
l = mid + 1;
165-
} else {
173+
if (nums[mid] > mid) {
166174
r = mid;
175+
} else {
176+
l = mid + 1;
167177
}
168178
}
169-
return r;
179+
return l;
170180
}
171181
}
172182
```
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
class Solution {
22
public:
33
int missingNumber(vector<int>& nums) {
4-
int left = 0, right = nums.size();
5-
while (left < right) {
6-
int mid = left + (right - left) / 2;
7-
if (nums[mid] == mid) {
8-
left = mid + 1;
4+
int l = 0, r = nums.size();
5+
while (l < r) {
6+
int mid = (l + r) >> 1;
7+
if (nums[mid] > mid) {
8+
r = mid;
99
} else {
10-
right = mid;
10+
l = mid + 1;
1111
}
1212
}
13-
return left;
13+
return l;
1414
}
15-
};
15+
};
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
public class Solution {
22
public int MissingNumber(int[] nums) {
3-
int l = 0, r = nums.Length - 1;
4-
if (r == 0 || nums[0] == 1) {
5-
return nums[0] ^ 1;
6-
}
7-
if (nums[r] == r) {
8-
return r + 1;
9-
}
3+
int l = 0, r = nums.Length;
104
while (l < r) {
115
int mid = (l + r) >> 1;
12-
if (nums[mid] == mid) {
13-
l = mid + 1;
14-
} else {
6+
if (nums[mid] > mid) {
157
r = mid;
8+
} else {
9+
l = mid + 1;
1610
}
1711
}
18-
return r;
12+
return l;
1913
}
2014
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func missingNumber(nums []int) int {
2+
l, r := 0, len(nums)
3+
for l < r {
4+
mid := (l + r) >> 1
5+
if nums[mid] > mid {
6+
r = mid
7+
} else {
8+
l = mid + 1
9+
}
10+
}
11+
return l
12+
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
class Solution {
22
public int missingNumber(int[] nums) {
3-
int l = 0, r = nums.length - 1;
4-
if (r == 0 || nums[0] == 1) {
5-
return nums[0] ^ 1;
6-
}
7-
if (nums[r] == r) {
8-
return r + 1;
9-
}
10-
while (r - l > 1) {
11-
int m = (l + r) >>> 1;
12-
if (nums[m] == m) {
13-
l = m;
3+
int l = 0, r = nums.length;
4+
while (l < r) {
5+
int mid = (l + r) >>> 1;
6+
if (nums[mid] > mid) {
7+
r = mid;
148
} else {
15-
r = m;
9+
l = mid + 1;
1610
}
1711
}
18-
return nums[r] - 1;
12+
return l;
1913
}
2014
}

lcof/面试题53 - II. 0~n-1中缺失的数字/Solution.js

+8-9
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
* @return {number}
44
*/
55
var missingNumber = function (nums) {
6-
if (!nums || !nums.length) return 0;
7-
let left = 0;
8-
let right = nums.length - 1;
9-
while (left < right) {
10-
let mid = left + ~~((right - left) / 2);
11-
if (nums[mid] !== mid) {
12-
right = mid;
6+
let l = 0;
7+
let r = nums.length;
8+
while (l < r) {
9+
const mid = (l + r) >> 1;
10+
if (nums[mid] > mid) {
11+
r = mid;
1312
} else {
14-
left = mid + 1;
13+
l = mid + 1;
1514
}
1615
}
17-
return nums[left] === left ? nums.length : left;
16+
return l;
1817
};
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
class Solution:
22
def missingNumber(self, nums: List[int]) -> int:
3-
l, r = 0, len(nums) - 1
4-
if r == 0 or nums[0] == 1:
5-
return nums[0] ^ 1
6-
if nums[r] == r:
7-
return r + 1
8-
while r - l > 1:
9-
m = (l + r) >> 1
10-
if nums[m] == m:
11-
l = m
3+
l, r = 0, len(nums)
4+
while l < r:
5+
mid = (l + r) >> 1
6+
if nums[mid] > mid:
7+
r = mid
128
else:
13-
r = m
14-
return nums[r] - 1
9+
l = mid + 1
10+
return l
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
impl Solution {
22
pub fn missing_number(nums: Vec<i32>) -> i32 {
3-
let mut prev = 0;
4-
for &num in nums.iter() {
5-
if prev != num {
6-
return prev;
3+
let (mut l, mut r) = (0, nums.len() as i32);
4+
while l < r {
5+
let mut mid = (l + r) >> 1;
6+
if nums[mid as usize] > mid {
7+
r = mid;
8+
} else {
9+
l = mid + 1;
710
}
8-
prev += 1;
911
}
10-
prev
12+
l
1113
}
12-
}
14+
}

0 commit comments

Comments
 (0)