Skip to content

Commit 79488d3

Browse files
committed
feat: add solution to lc problem: No.1552
No.1552.Magnetic Force Between Two Ball
1 parent d49b71f commit 79488d3

File tree

7 files changed

+272
-148
lines changed

7 files changed

+272
-148
lines changed

solution/1500-1599/1552.Magnetic Force Between Two Balls/README.md

Lines changed: 73 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49-
二分查找
49+
**方法一:二分查找**
5050

51-
先排序,然后二分枚举相邻两球之间的间距,只需要统计当前间距下能放下多少个小球,记为 cnt,若 `cnt >= m`,说明此间距符合条件。继续二分查找,最终找到符合条件的最大间距。
51+
先对 position 进行排序。
52+
53+
然后二分枚举磁力值(相邻两球的最小间距),统计当前最小磁力值下能放下多少个小球,记为 cnt。若 `cnt >= m`,说明此磁力值符合条件。继续二分查找,最终找到符合条件的最大磁力值。
5254

5355
<!-- tabs:start -->
5456

@@ -59,20 +61,20 @@
5961
```python
6062
class Solution:
6163
def maxDistance(self, position: List[int], m: int) -> int:
62-
position.sort()
63-
6464
def check(f):
65-
pre = position[0]
65+
prev = position[0]
6666
cnt = 1
67-
for pos in position[1:]:
68-
if pos - pre >= f:
67+
for curr in position[1:]:
68+
if curr - prev >= f:
69+
prev = curr
6970
cnt += 1
70-
pre = pos
7171
return cnt >= m
7272

73+
position.sort()
7374
left, right = 1, position[-1]
7475
while left < right:
7576
mid = (left + right + 1) >> 1
77+
7678
if check(mid):
7779
left = mid
7880
else:
@@ -90,7 +92,7 @@ class Solution {
9092
Arrays.sort(position);
9193
int left = 1, right = position[position.length - 1];
9294
while (left < right) {
93-
int mid = (left + right + 1) >> 1;
95+
int mid = (left + right + 1) >>> 1;
9496
if (check(position, mid, m)) {
9597
left = mid;
9698
} else {
@@ -101,12 +103,13 @@ class Solution {
101103
}
102104

103105
private boolean check(int[] position, int f, int m) {
104-
int pre = position[0];
106+
int prev = position[0];
105107
int cnt = 1;
106108
for (int i = 1; i < position.length; ++i) {
107-
if (position[i] - pre >= f) {
109+
int curr = position[i];
110+
if (curr - prev >= f) {
111+
prev = curr;
108112
++cnt;
109-
pre = position[i];
110113
}
111114
}
112115
return cnt >= m;
@@ -122,7 +125,8 @@ public:
122125
int maxDistance(vector<int>& position, int m) {
123126
sort(position.begin(), position.end());
124127
int left = 1, right = position[position.size() - 1];
125-
while (left < right) {
128+
while (left < right)
129+
{
126130
int mid = (left + right + 1) >> 1;
127131
if (check(position, mid, m)) left = mid;
128132
else right = mid - 1;
@@ -131,17 +135,21 @@ public:
131135
}
132136

133137
bool check(vector<int>& position, int f, int m) {
134-
int pre = position[0];
138+
int prev = position[0];
135139
int cnt = 1;
136-
for (int i = 1; i < position.size(); ++i) {
137-
if (position[i] - pre >= f) {
140+
for (int i = 1; i < position.size(); ++i)
141+
{
142+
int curr = position[i];
143+
if (curr - prev >= f)
144+
{
145+
prev = curr;
138146
++cnt;
139-
pre = position[i];
140147
}
141148
}
142149
return cnt >= m;
143150
}
144151
};
152+
145153
```
146154

147155
### **Go**
@@ -150,27 +158,64 @@ public:
150158
func maxDistance(position []int, m int) int {
151159
sort.Ints(position)
152160
left, right := 1, position[len(position)-1]
161+
check := func(f int) bool {
162+
prev, cnt := position[0], 1
163+
for _, curr := range position[1:] {
164+
if curr-prev >= f {
165+
prev = curr
166+
cnt++
167+
}
168+
}
169+
return cnt >= m
170+
}
153171
for left < right {
154172
mid := (left + right + 1) >> 1
155-
if check(position, mid, m) {
173+
if check(mid) {
156174
left = mid
157175
} else {
158176
right = mid - 1
159177
}
160178
}
161179
return left
162180
}
181+
```
163182

164-
func check(position []int, f, m int) bool {
165-
pre, cnt := position[0], 1
166-
for i := 1; i < len(position); i++ {
167-
if position[i]-pre >= f {
168-
cnt++
169-
pre = position[i]
170-
}
171-
}
172-
return cnt >= m
173-
}
183+
### **JavaScript**
184+
185+
```js
186+
/**
187+
* @param {number[]} position
188+
* @param {number} m
189+
* @return {number}
190+
*/
191+
var maxDistance = function (position, m) {
192+
position.sort((a, b) => {
193+
return a - b;
194+
});
195+
let left = 1,
196+
right = position[position.length - 1];
197+
const check = function (f) {
198+
let prev = position[0];
199+
let cnt = 1;
200+
for (let i = 1; i < position.length; ++i) {
201+
const curr = position[i];
202+
if (curr - prev >= f) {
203+
prev = curr;
204+
++cnt;
205+
}
206+
}
207+
return cnt >= m;
208+
};
209+
while (left < right) {
210+
const mid = (left + right + 1) >> 1;
211+
if (check(mid)) {
212+
left = mid;
213+
} else {
214+
right = mid - 1;
215+
}
216+
}
217+
return left;
218+
};
174219
```
175220

176221
### **...**

solution/1500-1599/1552.Magnetic Force Between Two Balls/README_EN.md

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,20 @@
4747
```python
4848
class Solution:
4949
def maxDistance(self, position: List[int], m: int) -> int:
50-
position.sort()
51-
5250
def check(f):
53-
pre = position[0]
51+
prev = position[0]
5452
cnt = 1
55-
for pos in position[1:]:
56-
if pos - pre >= f:
53+
for curr in position[1:]:
54+
if curr - prev >= f:
55+
prev = curr
5756
cnt += 1
58-
pre = pos
5957
return cnt >= m
6058

59+
position.sort()
6160
left, right = 1, position[-1]
6261
while left < right:
6362
mid = (left + right + 1) >> 1
63+
6464
if check(mid):
6565
left = mid
6666
else:
@@ -76,7 +76,7 @@ class Solution {
7676
Arrays.sort(position);
7777
int left = 1, right = position[position.length - 1];
7878
while (left < right) {
79-
int mid = (left + right + 1) >> 1;
79+
int mid = (left + right + 1) >>> 1;
8080
if (check(position, mid, m)) {
8181
left = mid;
8282
} else {
@@ -87,12 +87,13 @@ class Solution {
8787
}
8888

8989
private boolean check(int[] position, int f, int m) {
90-
int pre = position[0];
90+
int prev = position[0];
9191
int cnt = 1;
9292
for (int i = 1; i < position.length; ++i) {
93-
if (position[i] - pre >= f) {
93+
int curr = position[i];
94+
if (curr - prev >= f) {
95+
prev = curr;
9496
++cnt;
95-
pre = position[i];
9697
}
9798
}
9899
return cnt >= m;
@@ -108,7 +109,8 @@ public:
108109
int maxDistance(vector<int>& position, int m) {
109110
sort(position.begin(), position.end());
110111
int left = 1, right = position[position.size() - 1];
111-
while (left < right) {
112+
while (left < right)
113+
{
112114
int mid = (left + right + 1) >> 1;
113115
if (check(position, mid, m)) left = mid;
114116
else right = mid - 1;
@@ -117,12 +119,15 @@ public:
117119
}
118120

119121
bool check(vector<int>& position, int f, int m) {
120-
int pre = position[0];
122+
int prev = position[0];
121123
int cnt = 1;
122-
for (int i = 1; i < position.size(); ++i) {
123-
if (position[i] - pre >= f) {
124+
for (int i = 1; i < position.size(); ++i)
125+
{
126+
int curr = position[i];
127+
if (curr - prev >= f)
128+
{
129+
prev = curr;
124130
++cnt;
125-
pre = position[i];
126131
}
127132
}
128133
return cnt >= m;
@@ -136,27 +141,64 @@ public:
136141
func maxDistance(position []int, m int) int {
137142
sort.Ints(position)
138143
left, right := 1, position[len(position)-1]
144+
check := func(f int) bool {
145+
prev, cnt := position[0], 1
146+
for _, curr := range position[1:] {
147+
if curr-prev >= f {
148+
prev = curr
149+
cnt++
150+
}
151+
}
152+
return cnt >= m
153+
}
139154
for left < right {
140155
mid := (left + right + 1) >> 1
141-
if check(position, mid, m) {
156+
if check(mid) {
142157
left = mid
143158
} else {
144159
right = mid - 1
145160
}
146161
}
147162
return left
148163
}
164+
```
149165

150-
func check(position []int, f, m int) bool {
151-
pre, cnt := position[0], 1
152-
for i := 1; i < len(position); i++ {
153-
if position[i]-pre >= f {
154-
cnt++
155-
pre = position[i]
156-
}
157-
}
158-
return cnt >= m
159-
}
166+
### **JavaScript**
167+
168+
```js
169+
/**
170+
* @param {number[]} position
171+
* @param {number} m
172+
* @return {number}
173+
*/
174+
var maxDistance = function (position, m) {
175+
position.sort((a, b) => {
176+
return a - b;
177+
});
178+
let left = 1,
179+
right = position[position.length - 1];
180+
const check = function (f) {
181+
let prev = position[0];
182+
let cnt = 1;
183+
for (let i = 1; i < position.length; ++i) {
184+
const curr = position[i];
185+
if (curr - prev >= f) {
186+
prev = curr;
187+
++cnt;
188+
}
189+
}
190+
return cnt >= m;
191+
};
192+
while (left < right) {
193+
const mid = (left + right + 1) >> 1;
194+
if (check(mid)) {
195+
left = mid;
196+
} else {
197+
right = mid - 1;
198+
}
199+
}
200+
return left;
201+
};
160202
```
161203

162204
### **...**
Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
1-
class Solution {
2-
public:
3-
int maxDistance(vector<int>& position, int m) {
4-
sort(position.begin(), position.end());
5-
int left = 1, right = position[position.size() - 1];
6-
while (left < right) {
7-
int mid = (left + right + 1) >> 1;
8-
if (check(position, mid, m)) left = mid;
9-
else right = mid - 1;
10-
}
11-
return left;
12-
}
13-
14-
bool check(vector<int>& position, int f, int m) {
15-
int pre = position[0];
16-
int cnt = 1;
17-
for (int i = 1; i < position.size(); ++i) {
18-
if (position[i] - pre >= f) {
19-
++cnt;
20-
pre = position[i];
21-
}
22-
}
23-
return cnt >= m;
24-
}
1+
class Solution {
2+
public:
3+
int maxDistance(vector<int>& position, int m) {
4+
sort(position.begin(), position.end());
5+
int left = 1, right = position[position.size() - 1];
6+
while (left < right)
7+
{
8+
int mid = (left + right + 1) >> 1;
9+
if (check(position, mid, m)) left = mid;
10+
else right = mid - 1;
11+
}
12+
return left;
13+
}
14+
15+
bool check(vector<int>& position, int f, int m) {
16+
int prev = position[0];
17+
int cnt = 1;
18+
for (int i = 1; i < position.size(); ++i)
19+
{
20+
int curr = position[i];
21+
if (curr - prev >= f)
22+
{
23+
prev = curr;
24+
++cnt;
25+
}
26+
}
27+
return cnt >= m;
28+
}
2529
};

0 commit comments

Comments
 (0)