Skip to content

Commit 0ee6b54

Browse files
committed
feat: add solutions to lc problem: No.1539
No.1539.Kth Missing Positive Number
1 parent d8d118b commit 0ee6b54

File tree

9 files changed

+194
-95
lines changed

9 files changed

+194
-95
lines changed

solution/0400-0499/0441.Arranging Coins/README.md

+14-18
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43-
1. 数学推导
43+
**方法一:数学推导**
4444

4545
`(1 + x) * x / 2 <= n`,求解 x。
4646

4747
`(x + 1/2)² <= 2n + 1/4`,即 `x <= sqrt(2n + 1/4) - 1/2`
4848

4949
由于 2n 可能溢出,故转换为 `x <= sqrt(2) * sqrt(n + 1/8) - 1/2`
5050

51-
2. 二分查找
51+
**方法二:二分查找**
5252

5353
<!-- tabs:start -->
5454

@@ -68,11 +68,10 @@ class Solution:
6868
left, right = 1, n
6969
while left < right:
7070
mid = (left + right + 1) >> 1
71-
s = ((1 + mid) * mid) >> 1
72-
if n < s:
73-
right = mid - 1
74-
else:
71+
if (1 + mid) * mid // 2 <= n:
7572
left = mid
73+
else:
74+
right = mid - 1
7675
return left
7776
```
7877

@@ -93,12 +92,11 @@ class Solution {
9392
public int arrangeCoins(int n) {
9493
long left = 1, right = n;
9594
while (left < right) {
96-
long mid = (left + right + 1) >> 1;
97-
long s = ((1 + mid) * mid) >> 1;
98-
if (n < s) {
99-
right = mid - 1;
100-
} else {
95+
long mid = (left + right + 1) >>> 1;
96+
if ((1 + mid) * mid / 2 <= n) {
10197
left = mid;
98+
} else {
99+
right = mid - 1;
102100
}
103101
}
104102
return (int) left;
@@ -118,9 +116,8 @@ public:
118116
while (left < right)
119117
{
120118
LL mid = left + right + 1 >> 1;
121-
LL s = (1 + mid) * mid >> 1;
122-
if (n < s) right = mid - 1;
123-
else left = mid;
119+
if ((1 + mid) * mid / 2 <= n) left = mid;
120+
else right = mid - 1;
124121
}
125122
return left;
126123
}
@@ -134,11 +131,10 @@ func arrangeCoins(n int) int {
134131
left, right := 1, n
135132
for left < right {
136133
mid := (left + right + 1) >> 1
137-
s := (1 + mid) * mid >> 1
138-
if n < s {
139-
right = mid - 1
140-
} else {
134+
if (1+mid)*mid/2 <= n {
141135
left = mid
136+
} else {
137+
right = mid - 1
142138
}
143139
}
144140
return left

solution/0400-0499/0441.Arranging Coins/README_EN.md

+12-16
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ class Solution:
5050
left, right = 1, n
5151
while left < right:
5252
mid = (left + right + 1) >> 1
53-
s = ((1 + mid) * mid) >> 1
54-
if n < s:
55-
right = mid - 1
56-
else:
53+
if (1 + mid) * mid // 2 <= n:
5754
left = mid
55+
else:
56+
right = mid - 1
5857
return left
5958
```
6059

@@ -73,12 +72,11 @@ class Solution {
7372
public int arrangeCoins(int n) {
7473
long left = 1, right = n;
7574
while (left < right) {
76-
long mid = (left + right + 1) >> 1;
77-
long s = ((1 + mid) * mid) >> 1;
78-
if (n < s) {
79-
right = mid - 1;
80-
} else {
75+
long mid = (left + right + 1) >>> 1;
76+
if ((1 + mid) * mid / 2 <= n) {
8177
left = mid;
78+
} else {
79+
right = mid - 1;
8280
}
8381
}
8482
return (int) left;
@@ -98,9 +96,8 @@ public:
9896
while (left < right)
9997
{
10098
LL mid = left + right + 1 >> 1;
101-
LL s = (1 + mid) * mid >> 1;
102-
if (n < s) right = mid - 1;
103-
else left = mid;
99+
if ((1 + mid) * mid / 2 <= n) left = mid;
100+
else right = mid - 1;
104101
}
105102
return left;
106103
}
@@ -114,11 +111,10 @@ func arrangeCoins(n int) int {
114111
left, right := 1, n
115112
for left < right {
116113
mid := (left + right + 1) >> 1
117-
s := (1 + mid) * mid >> 1
118-
if n < s {
119-
right = mid - 1
120-
} else {
114+
if (1+mid)*mid/2 <= n {
121115
left = mid
116+
} else {
117+
right = mid - 1
122118
}
123119
}
124120
return left
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
func arrangeCoins(n int) int {
2-
left, right := 1, n
3-
for left < right {
4-
mid := (left + right + 1) >> 1
5-
s := (1 + mid) * mid >> 1
6-
if n < s {
7-
right = mid - 1
8-
} else {
9-
left = mid
10-
}
11-
}
12-
return left
1+
func arrangeCoins(n int) int {
2+
left, right := 1, n
3+
for left < right {
4+
mid := (left + right + 1) >> 1
5+
if (1+mid)*mid/2 <= n {
6+
left = mid
7+
} else {
8+
right = mid - 1
9+
}
10+
}
11+
return left
1312
}

solution/1500-1599/1539.Kth Missing Positive Number/README.md

+50-10
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:二分查找**
45+
4446
<!-- tabs:start -->
4547

4648
### **Python3**
@@ -54,12 +56,12 @@ class Solution:
5456
return k
5557
left, right = 0, len(arr)
5658
while left < right:
57-
mid = (left + right) // 2
58-
if arr[mid] - mid - 1 < k:
59-
left = mid + 1
60-
else:
59+
mid = (left + right) >> 1
60+
if arr[mid] - mid - 1 >= k:
6161
right = mid
62-
return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1]
62+
else:
63+
left = mid + 1
64+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1)
6365
```
6466

6567
### **Java**
@@ -75,18 +77,56 @@ class Solution {
7577
int left = 0, right = arr.length;
7678
while (left < right) {
7779
int mid = (left + right) >> 1;
78-
int cur = mid == arr.length ? Integer.MAX_VALUE : arr[mid];
79-
if (cur - mid - 1 < k) {
80-
left = mid + 1;
81-
} else {
80+
if (arr[mid] - mid - 1 >= k) {
8281
right = mid;
82+
} else {
83+
left = mid + 1;
8384
}
8485
}
85-
return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1];
86+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1);
8687
}
8788
}
8889
```
8990

91+
### **C++**
92+
93+
```cpp
94+
class Solution {
95+
public:
96+
int findKthPositive(vector<int>& arr, int k) {
97+
if (arr[0] > k) return k;
98+
int left = 0, right = arr.size();
99+
while (left < right)
100+
{
101+
int mid = (left + right) >> 1;
102+
if (arr[mid] - mid - 1 >= k) right = mid;
103+
else left = mid + 1;
104+
}
105+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1);
106+
}
107+
};
108+
```
109+
110+
### **Go**
111+
112+
```go
113+
func findKthPositive(arr []int, k int) int {
114+
if arr[0] > k {
115+
return k
116+
}
117+
left, right := 0, len(arr)
118+
for left < right {
119+
mid := (left + right) >> 1
120+
if arr[mid]-mid-1 >= k {
121+
right = mid
122+
} else {
123+
left = mid + 1
124+
}
125+
}
126+
return arr[left-1] + k - (arr[left-1] - (left - 1) - 1)
127+
}
128+
```
129+
90130
### **...**
91131

92132
```

solution/1500-1599/1539.Kth Missing Positive Number/README_EN.md

+50-10
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
## Solutions
3939

40+
Binary search.
41+
4042
<!-- tabs:start -->
4143

4244
### **Python3**
@@ -48,12 +50,12 @@ class Solution:
4850
return k
4951
left, right = 0, len(arr)
5052
while left < right:
51-
mid = (left + right) // 2
52-
if arr[mid] - mid - 1 < k:
53-
left = mid + 1
54-
else:
53+
mid = (left + right) >> 1
54+
if arr[mid] - mid - 1 >= k:
5555
right = mid
56-
return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1]
56+
else:
57+
left = mid + 1
58+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1)
5759
```
5860

5961
### **Java**
@@ -67,18 +69,56 @@ class Solution {
6769
int left = 0, right = arr.length;
6870
while (left < right) {
6971
int mid = (left + right) >> 1;
70-
int cur = mid == arr.length ? Integer.MAX_VALUE : arr[mid];
71-
if (cur - mid - 1 < k) {
72-
left = mid + 1;
73-
} else {
72+
if (arr[mid] - mid - 1 >= k) {
7473
right = mid;
74+
} else {
75+
left = mid + 1;
7576
}
7677
}
77-
return k - (arr[left - 1] - (left - 1) - 1) + arr[left - 1];
78+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1);
7879
}
7980
}
8081
```
8182

83+
### **C++**
84+
85+
```cpp
86+
class Solution {
87+
public:
88+
int findKthPositive(vector<int>& arr, int k) {
89+
if (arr[0] > k) return k;
90+
int left = 0, right = arr.size();
91+
while (left < right)
92+
{
93+
int mid = (left + right) >> 1;
94+
if (arr[mid] - mid - 1 >= k) right = mid;
95+
else left = mid + 1;
96+
}
97+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1);
98+
}
99+
};
100+
```
101+
102+
### **Go**
103+
104+
```go
105+
func findKthPositive(arr []int, k int) int {
106+
if arr[0] > k {
107+
return k
108+
}
109+
left, right := 0, len(arr)
110+
for left < right {
111+
mid := (left + right) >> 1
112+
if arr[mid]-mid-1 >= k {
113+
right = mid
114+
} else {
115+
left = mid + 1
116+
}
117+
}
118+
return arr[left-1] + k - (arr[left-1] - (left - 1) - 1)
119+
}
120+
```
121+
82122
### **...**
83123

84124
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
int findKthPositive(vector<int>& arr, int k) {
4+
if (arr[0] > k) return k;
5+
int left = 0, right = arr.size();
6+
while (left < right)
7+
{
8+
int mid = (left + right) >> 1;
9+
if (arr[mid] - mid - 1 >= k) right = mid;
10+
else left = mid + 1;
11+
}
12+
return arr[left - 1] + k - (arr[left - 1] - (left - 1) - 1);
13+
}
14+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
func findKthPositive(arr []int, k int) int {
2+
if arr[0] > k {
3+
return k
4+
}
5+
left, right := 0, len(arr)
6+
for left < right {
7+
mid := (left + right) >> 1
8+
if arr[mid]-mid-1 >= k {
9+
right = mid
10+
} else {
11+
left = mid + 1
12+
}
13+
}
14+
return arr[left-1] + k - (arr[left-1] - (left - 1) - 1)
15+
}

0 commit comments

Comments
 (0)