Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /