Skip to content

Commit c408386

Browse files
committed
feat: add solutions to lc problem: No.0287
No.0287.Find the Duplicate Number
1 parent f769d96 commit c408386

File tree

8 files changed

+317
-98
lines changed

8 files changed

+317
-98
lines changed

solution/0200-0299/0287.Find the Duplicate Number/README.md

+106-28
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
<!-- 这里可写通用的实现逻辑 -->
5454

55-
二分法。
55+
**方法一:二分查找**
5656

5757
如果值范围在 `[1, mid]` 的数小于等于 mid,说明此范围内没有重复的数,否则说明有重复数。
5858

@@ -65,18 +65,15 @@
6565
```python
6666
class Solution:
6767
def findDuplicate(self, nums: List[int]) -> int:
68-
l, r = 0, len(nums) - 1
69-
while l < r:
70-
mid = (l + r) >> 1
71-
cnt = 0
72-
for e in nums:
73-
if e <= mid:
74-
cnt += 1
75-
if cnt <= mid:
76-
l = mid + 1
68+
left, right = 1, len(nums) - 1
69+
while left < right:
70+
mid = (left + right) >> 1
71+
cnt = sum(v <= mid for v in nums)
72+
if cnt > mid:
73+
right = mid
7774
else:
78-
r = mid
79-
return l
75+
left = mid + 1
76+
return left
8077
```
8178

8279
### **Java**
@@ -86,17 +83,22 @@ class Solution:
8683
```java
8784
class Solution {
8885
public int findDuplicate(int[] nums) {
89-
int l = 1, r = nums.length - 1;
90-
while (l < r) {
91-
int mid = (l + r) >>> 1;
86+
int left = 1, right = nums.length - 1;
87+
while (left < right) {
88+
int mid = (left + right) >> 1;
9289
int cnt = 0;
93-
for (int e : nums) {
94-
if (e <= mid) ++cnt;
90+
for (int v : nums) {
91+
if (v <= mid) {
92+
++cnt;
93+
}
94+
}
95+
if (cnt > mid) {
96+
right = mid;
97+
} else {
98+
left = mid + 1;
9599
}
96-
if (cnt <= mid) l = mid + 1;
97-
else r = mid;
98100
}
99-
return l;
101+
return left;
100102
}
101103
}
102104
```
@@ -107,21 +109,97 @@ class Solution {
107109
class Solution {
108110
public:
109111
int findDuplicate(vector<int>& nums) {
110-
int l = 0, r = nums.size() - 1;
111-
while (l < r) {
112-
int mid = l + ((r - l) >> 1);
112+
int left = 1, right = nums.size() - 1;
113+
while (left < right)
114+
{
115+
int mid = (left + right) >> 1;
113116
int cnt = 0;
114-
for (auto e : nums) {
115-
if (e <= mid) ++cnt;
117+
for (int& v : nums)
118+
if (v <= mid)
119+
++cnt;
120+
if (cnt > mid) right = mid;
121+
else left = mid + 1;
122+
}
123+
return left;
124+
}
125+
};
126+
```
127+
128+
### **Go**
129+
130+
```go
131+
func findDuplicate(nums []int) int {
132+
left, right := 1, len(nums)-1
133+
for left < right {
134+
mid := (left + right) >> 1
135+
cnt := 0
136+
for _, v := range nums {
137+
if v <= mid {
138+
cnt++
139+
}
140+
}
141+
if cnt > mid {
142+
right = mid
143+
} else {
144+
left = mid + 1
145+
}
146+
}
147+
return left
148+
}
149+
```
150+
151+
### **JavaScript**
152+
153+
```js
154+
/**
155+
* @param {number[]} nums
156+
* @return {number}
157+
*/
158+
var findDuplicate = function (nums) {
159+
let left = 1,
160+
right = nums.length - 1;
161+
while (left < right) {
162+
const mid = (left + right) >> 1;
163+
let cnt = 0;
164+
for (let v of nums) {
165+
if (v <= mid) {
166+
++cnt;
116167
}
117-
if (cnt <= mid) l = mid + 1;
118-
else r = mid;
119168
}
120-
return l;
169+
if (cnt > mid) {
170+
right = mid;
171+
} else {
172+
left = mid + 1;
173+
}
121174
}
175+
return left;
122176
};
123177
```
124178

179+
### **TypeScript**
180+
181+
```ts
182+
function findDuplicate(nums: number[]): number {
183+
let left = 1,
184+
right = nums.length - 1;
185+
while (left < right) {
186+
const mid = (left + right) >> 1;
187+
let cnt = 0;
188+
for (let v of nums) {
189+
if (v <= mid) {
190+
++cnt;
191+
}
192+
}
193+
if (cnt > mid) {
194+
right = mid;
195+
} else {
196+
left = mid + 1;
197+
}
198+
}
199+
return left;
200+
}
201+
```
202+
125203
### **...**
126204

127205
```

solution/0200-0299/0287.Find the Duplicate Number/README_EN.md

+105-27
Original file line numberDiff line numberDiff line change
@@ -52,36 +52,38 @@
5252
```python
5353
class Solution:
5454
def findDuplicate(self, nums: List[int]) -> int:
55-
l, r = 0, len(nums) - 1
56-
while l < r:
57-
mid = (l + r) >> 1
58-
cnt = 0
59-
for e in nums:
60-
if e <= mid:
61-
cnt += 1
62-
if cnt <= mid:
63-
l = mid + 1
55+
left, right = 1, len(nums) - 1
56+
while left < right:
57+
mid = (left + right) >> 1
58+
cnt = sum(v <= mid for v in nums)
59+
if cnt > mid:
60+
right = mid
6461
else:
65-
r = mid
66-
return l
62+
left = mid + 1
63+
return left
6764
```
6865

6966
### **Java**
7067

7168
```java
7269
class Solution {
7370
public int findDuplicate(int[] nums) {
74-
int l = 1, r = nums.length - 1;
75-
while (l < r) {
76-
int mid = (l + r) >>> 1;
71+
int left = 1, right = nums.length - 1;
72+
while (left < right) {
73+
int mid = (left + right) >> 1;
7774
int cnt = 0;
78-
for (int e : nums) {
79-
if (e <= mid) ++cnt;
75+
for (int v : nums) {
76+
if (v <= mid) {
77+
++cnt;
78+
}
79+
}
80+
if (cnt > mid) {
81+
right = mid;
82+
} else {
83+
left = mid + 1;
8084
}
81-
if (cnt <= mid) l = mid + 1;
82-
else r = mid;
8385
}
84-
return l;
86+
return left;
8587
}
8688
}
8789
```
@@ -92,21 +94,97 @@ class Solution {
9294
class Solution {
9395
public:
9496
int findDuplicate(vector<int>& nums) {
95-
int l = 0, r = nums.size() - 1;
96-
while (l < r) {
97-
int mid = l + ((r - l) >> 1);
97+
int left = 1, right = nums.size() - 1;
98+
while (left < right)
99+
{
100+
int mid = (left + right) >> 1;
98101
int cnt = 0;
99-
for (auto e : nums) {
100-
if (e <= mid) ++cnt;
102+
for (int& v : nums)
103+
if (v <= mid)
104+
++cnt;
105+
if (cnt > mid) right = mid;
106+
else left = mid + 1;
107+
}
108+
return left;
109+
}
110+
};
111+
```
112+
113+
### **Go**
114+
115+
```go
116+
func findDuplicate(nums []int) int {
117+
left, right := 1, len(nums)-1
118+
for left < right {
119+
mid := (left + right) >> 1
120+
cnt := 0
121+
for _, v := range nums {
122+
if v <= mid {
123+
cnt++
124+
}
125+
}
126+
if cnt > mid {
127+
right = mid
128+
} else {
129+
left = mid + 1
130+
}
131+
}
132+
return left
133+
}
134+
```
135+
136+
### **JavaScript**
137+
138+
```js
139+
/**
140+
* @param {number[]} nums
141+
* @return {number}
142+
*/
143+
var findDuplicate = function (nums) {
144+
let left = 1,
145+
right = nums.length - 1;
146+
while (left < right) {
147+
const mid = (left + right) >> 1;
148+
let cnt = 0;
149+
for (let v of nums) {
150+
if (v <= mid) {
151+
++cnt;
101152
}
102-
if (cnt <= mid) l = mid + 1;
103-
else r = mid;
104153
}
105-
return l;
154+
if (cnt > mid) {
155+
right = mid;
156+
} else {
157+
left = mid + 1;
158+
}
106159
}
160+
return left;
107161
};
108162
```
109163

164+
### **TypeScript**
165+
166+
```ts
167+
function findDuplicate(nums: number[]): number {
168+
let left = 1,
169+
right = nums.length - 1;
170+
while (left < right) {
171+
const mid = (left + right) >> 1;
172+
let cnt = 0;
173+
for (let v of nums) {
174+
if (v <= mid) {
175+
++cnt;
176+
}
177+
}
178+
if (cnt > mid) {
179+
right = mid;
180+
} else {
181+
left = mid + 1;
182+
}
183+
}
184+
return left;
185+
}
186+
```
187+
110188
### **...**
111189

112190
```
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
class Solution {
2-
public:
3-
int findDuplicate(vector<int>& nums) {
4-
int l = 0, r = nums.size() - 1;
5-
while (l < r) {
6-
int mid = l + ((r - l) >> 1);
7-
int cnt = 0;
8-
for (auto e : nums) {
9-
if (e <= mid) ++cnt;
10-
}
11-
if (cnt <= mid) l = mid + 1;
12-
else r = mid;
13-
}
14-
return l;
15-
}
1+
class Solution {
2+
public:
3+
int findDuplicate(vector<int>& nums) {
4+
int left = 1, right = nums.size() - 1;
5+
while (left < right)
6+
{
7+
int mid = (left + right) >> 1;
8+
int cnt = 0;
9+
for (int& v : nums)
10+
if (v <= mid)
11+
++cnt;
12+
if (cnt > mid) right = mid;
13+
else left = mid + 1;
14+
}
15+
return left;
16+
}
1617
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func findDuplicate(nums []int) int {
2+
left, right := 1, len(nums)-1
3+
for left < right {
4+
mid := (left + right) >> 1
5+
cnt := 0
6+
for _, v := range nums {
7+
if v <= mid {
8+
cnt++
9+
}
10+
}
11+
if cnt > mid {
12+
right = mid
13+
} else {
14+
left = mid + 1
15+
}
16+
}
17+
return left
18+
}

0 commit comments

Comments
 (0)