Skip to content

Commit 20f7188

Browse files
committed
feat: add solutions to lc problem: No.1401
No.1401.Circle and Rectangle Overlapping
1 parent 6c9870a commit 20f7188

File tree

7 files changed

+201
-108
lines changed

7 files changed

+201
-108
lines changed

solution/1400-1499/1401.Circle and Rectangle Overlapping/README.md

+79-40
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,21 @@
5353

5454
**方法一:数学**
5555

56-
计算矩形离圆最近的点和圆心的距离是否小于等于半径即可。
56+
对于一个点 $(x, y)$,它到圆心 $(xCenter, yCenter)$ 的最短距离为 $\sqrt{(x - xCenter)^2 + (y - yCenter)^2}$,如果这个距离小于等于半径 $radius$,那么这个点就在圆内(包括边界)。
57+
58+
而对于矩形内(包括边界)的点,它们的横坐标 $x$ 满足 $x_1 \leq x \leq x_2$,纵坐标 $y$ 满足 $y_1 \leq y \leq y_2$。要判断圆和矩形是否有重叠的部分,相当于在矩形内找到一个点 $(x, y)$,使得 $a = |x - xCenter|$ 和 $b = |y - yCenter|$ 都取到最小值,此时若 $a^2 + b^2 \leq radius^2$,则说明圆和矩形有重叠的部分。
59+
60+
因此,问题转化为求 $x \in [x_1, x_2]$ 时 $a = |x - xCenter|$ 的最小值,以及 $y \in [y_1, y_2]$ 时 $b = |y - yCenter|$ 的最小值。
61+
62+
对于 $x \in [x_1, x_2]$:
63+
64+
- 如果 $x_1 \leq xCenter \leq x_2$,那么 $|x - xCenter|$ 的最小值为 $0$;
65+
- 如果 $xCenter \lt x_1$,那么 $|x - xCenter|$ 的最小值为 $x_1 - xCenter$;
66+
- 如果 $xCenter \gt x_2$,那么 $|x - xCenter|$ 的最小值为 $xCenter - x_2$。
67+
68+
同理,我们可以求出 $y \in [y_1, y_2]$ 时 $|y - yCenter|$ 的最小值。以上我们可以统一用函数 $f(i, j, k)$ 来处理。
69+
70+
即 $a = f(x_1, x_2, xCenter)$, $b = f(y_1, y_2, yCenter)$,如果 $a^2 + b^2 \leq radius^2$,则说明圆和矩形有重叠的部分。
5771

5872
<!-- tabs:start -->
5973

@@ -63,26 +77,15 @@
6377

6478
```python
6579
class Solution:
66-
def checkOverlap(
67-
self,
68-
radius: int,
69-
xCenter: int,
70-
yCenter: int,
71-
x1: int,
72-
y1: int,
73-
x2: int,
74-
y2: int,
75-
) -> bool:
76-
dx = dy = 0
77-
if x1 > xCenter:
78-
dx = xCenter - x1
79-
elif x2 < xCenter:
80-
dx = xCenter - x2
81-
if y1 > yCenter:
82-
dy = yCenter - y1
83-
elif y2 < yCenter:
84-
dy = yCenter - y2
85-
return dx * dx + dy * dy <= radius * radius
80+
def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
81+
def f(i: int, j: int, k: int) -> int:
82+
if i <= k <= j:
83+
return 0
84+
return i - k if k < i else k - j
85+
86+
a = f(x1, x2, xCenter)
87+
b = f(y1, y2, yCenter)
88+
return a * a + b * b <= radius * radius
8689
```
8790

8891
### **Java**
@@ -91,11 +94,17 @@ class Solution:
9194

9295
```java
9396
class Solution {
94-
public boolean checkOverlap(
95-
int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
96-
int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
97-
int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
98-
return dx * dx + dy * dy <= radius * radius;
97+
public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
98+
int a = f(x1, x2, xCenter);
99+
int b = f(y1, y2, yCenter);
100+
return a * a + b * b <= radius * radius;
101+
}
102+
103+
private int f(int i, int j, int k) {
104+
if (i <= k && k <= j) {
105+
return 0;
106+
}
107+
return k < i ? i - k : k - j;
99108
}
100109
}
101110
```
@@ -106,9 +115,15 @@ class Solution {
106115
class Solution {
107116
public:
108117
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
109-
int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
110-
int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
111-
return dx * dx + dy * dy <= radius * radius;
118+
auto f = [](int i, int j, int k) -> int {
119+
if (i <= k && k <= j) {
120+
return 0;
121+
}
122+
return k < i ? i - k : k - j;
123+
};
124+
int a = f(x1, x2, xCenter);
125+
int b = f(y1, y2, yCenter);
126+
return a * a + b * b <= radius * radius;
112127
}
113128
};
114129
```
@@ -117,18 +132,42 @@ public:
117132
118133
```go
119134
func checkOverlap(radius int, xCenter int, yCenter int, x1 int, y1 int, x2 int, y2 int) bool {
120-
dx, dy := 0, 0
121-
if x1 > xCenter {
122-
dx = x1 - xCenter
123-
} else if x2 < xCenter {
124-
dx = x2 - xCenter
125-
}
126-
if y1 > yCenter {
127-
dy = y1 - yCenter
128-
} else if y2 < yCenter {
129-
dy = y2 - yCenter
135+
f := func(i, j, k int) int {
136+
if i <= k && k <= j {
137+
return 0
138+
}
139+
if k < i {
140+
return i - k
141+
}
142+
return k - j
130143
}
131-
return dx*dx+dy*dy <= radius*radius
144+
a := f(x1, x2, xCenter)
145+
b := f(y1, y2, yCenter)
146+
return a*a+b*b <= radius*radius
147+
}
148+
```
149+
150+
### **TypeScript**
151+
152+
```ts
153+
function checkOverlap(
154+
radius: number,
155+
xCenter: number,
156+
yCenter: number,
157+
x1: number,
158+
y1: number,
159+
x2: number,
160+
y2: number,
161+
): boolean {
162+
const f = (i: number, j: number, k: number) => {
163+
if (i <= k && k <= j) {
164+
return 0;
165+
}
166+
return k < i ? i - k : k - j;
167+
};
168+
const a = f(x1, x2, xCenter);
169+
const b = f(y1, y2, yCenter);
170+
return a * a + b * b <= radius * radius;
132171
}
133172
```
134173

solution/1400-1499/1401.Circle and Rectangle Overlapping/README_EN.md

+64-39
Original file line numberDiff line numberDiff line change
@@ -49,37 +49,32 @@
4949

5050
```python
5151
class Solution:
52-
def checkOverlap(
53-
self,
54-
radius: int,
55-
xCenter: int,
56-
yCenter: int,
57-
x1: int,
58-
y1: int,
59-
x2: int,
60-
y2: int,
61-
) -> bool:
62-
dx = dy = 0
63-
if x1 > xCenter:
64-
dx = xCenter - x1
65-
elif x2 < xCenter:
66-
dx = xCenter - x2
67-
if y1 > yCenter:
68-
dy = yCenter - y1
69-
elif y2 < yCenter:
70-
dy = yCenter - y2
71-
return dx * dx + dy * dy <= radius * radius
52+
def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
53+
def f(i: int, j: int, k: int) -> int:
54+
if i <= k <= j:
55+
return 0
56+
return i - k if k < i else k - j
57+
58+
a = f(x1, x2, xCenter)
59+
b = f(y1, y2, yCenter)
60+
return a * a + b * b <= radius * radius
7261
```
7362

7463
### **Java**
7564

7665
```java
7766
class Solution {
78-
public boolean checkOverlap(
79-
int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
80-
int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
81-
int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
82-
return dx * dx + dy * dy <= radius * radius;
67+
public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
68+
int a = f(x1, x2, xCenter);
69+
int b = f(y1, y2, yCenter);
70+
return a * a + b * b <= radius * radius;
71+
}
72+
73+
private int f(int i, int j, int k) {
74+
if (i <= k && k <= j) {
75+
return 0;
76+
}
77+
return k < i ? i - k : k - j;
8378
}
8479
}
8580
```
@@ -90,9 +85,15 @@ class Solution {
9085
class Solution {
9186
public:
9287
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
93-
int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
94-
int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
95-
return dx * dx + dy * dy <= radius * radius;
88+
auto f = [](int i, int j, int k) -> int {
89+
if (i <= k && k <= j) {
90+
return 0;
91+
}
92+
return k < i ? i - k : k - j;
93+
};
94+
int a = f(x1, x2, xCenter);
95+
int b = f(y1, y2, yCenter);
96+
return a * a + b * b <= radius * radius;
9697
}
9798
};
9899
```
@@ -101,18 +102,42 @@ public:
101102
102103
```go
103104
func checkOverlap(radius int, xCenter int, yCenter int, x1 int, y1 int, x2 int, y2 int) bool {
104-
dx, dy := 0, 0
105-
if x1 > xCenter {
106-
dx = x1 - xCenter
107-
} else if x2 < xCenter {
108-
dx = x2 - xCenter
109-
}
110-
if y1 > yCenter {
111-
dy = y1 - yCenter
112-
} else if y2 < yCenter {
113-
dy = y2 - yCenter
105+
f := func(i, j, k int) int {
106+
if i <= k && k <= j {
107+
return 0
108+
}
109+
if k < i {
110+
return i - k
111+
}
112+
return k - j
114113
}
115-
return dx*dx+dy*dy <= radius*radius
114+
a := f(x1, x2, xCenter)
115+
b := f(y1, y2, yCenter)
116+
return a*a+b*b <= radius*radius
117+
}
118+
```
119+
120+
### **TypeScript**
121+
122+
```ts
123+
function checkOverlap(
124+
radius: number,
125+
xCenter: number,
126+
yCenter: number,
127+
x1: number,
128+
y1: number,
129+
x2: number,
130+
y2: number,
131+
): boolean {
132+
const f = (i: number, j: number, k: number) => {
133+
if (i <= k && k <= j) {
134+
return 0;
135+
}
136+
return k < i ? i - k : k - j;
137+
};
138+
const a = f(x1, x2, xCenter);
139+
const b = f(y1, y2, yCenter);
140+
return a * a + b * b <= radius * radius;
116141
}
117142
```
118143

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
class Solution {
22
public:
33
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
4-
int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
5-
int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
6-
return dx * dx + dy * dy <= radius * radius;
4+
auto f = [](int i, int j, int k) -> int {
5+
if (i <= k && k <= j) {
6+
return 0;
7+
}
8+
return k < i ? i - k : k - j;
9+
};
10+
int a = f(x1, x2, xCenter);
11+
int b = f(y1, y2, yCenter);
12+
return a * a + b * b <= radius * radius;
713
}
814
};
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
func checkOverlap(radius int, xCenter int, yCenter int, x1 int, y1 int, x2 int, y2 int) bool {
2-
dx, dy := 0, 0
3-
if x1 > xCenter {
4-
dx = x1 - xCenter
5-
} else if x2 < xCenter {
6-
dx = x2 - xCenter
2+
f := func(i, j, k int) int {
3+
if i <= k && k <= j {
4+
return 0
5+
}
6+
if k < i {
7+
return i - k
8+
}
9+
return k - j
710
}
8-
if y1 > yCenter {
9-
dy = y1 - yCenter
10-
} else if y2 < yCenter {
11-
dy = y2 - yCenter
12-
}
13-
return dx*dx+dy*dy <= radius*radius
11+
a := f(x1, x2, xCenter)
12+
b := f(y1, y2, yCenter)
13+
return a*a+b*b <= radius*radius
1414
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
class Solution {
2-
public boolean checkOverlap(
3-
int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
4-
int dx = x1 > xCenter ? x1 - xCenter : (x2 < xCenter ? xCenter - x2 : 0);
5-
int dy = y1 > yCenter ? y1 - yCenter : (y2 < yCenter ? yCenter - y2 : 0);
6-
return dx * dx + dy * dy <= radius * radius;
2+
public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
3+
int a = f(x1, x2, xCenter);
4+
int b = f(y1, y2, yCenter);
5+
return a * a + b * b <= radius * radius;
6+
}
7+
8+
private int f(int i, int j, int k) {
9+
if (i <= k && k <= j) {
10+
return 0;
11+
}
12+
return k < i ? i - k : k - j;
713
}
814
}

solution/1400-1499/1401.Circle and Rectangle Overlapping/Solution.py

+8-10
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ def checkOverlap(
99
x2: int,
1010
y2: int,
1111
) -> bool:
12-
dx = dy = 0
13-
if x1 > xCenter:
14-
dx = xCenter - x1
15-
elif x2 < xCenter:
16-
dx = xCenter - x2
17-
if y1 > yCenter:
18-
dy = yCenter - y1
19-
elif y2 < yCenter:
20-
dy = yCenter - y2
21-
return dx * dx + dy * dy <= radius * radius
12+
def f(i: int, j: int, k: int) -> int:
13+
if i <= k <= j:
14+
return 0
15+
return i - k if k < i else k - j
16+
17+
a = f(x1, x2, xCenter)
18+
b = f(y1, y2, yCenter)
19+
return a * a + b * b <= radius * radius
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function checkOverlap(
2+
radius: number,
3+
xCenter: number,
4+
yCenter: number,
5+
x1: number,
6+
y1: number,
7+
x2: number,
8+
y2: number,
9+
): boolean {
10+
const f = (i: number, j: number, k: number) => {
11+
if (i <= k && k <= j) {
12+
return 0;
13+
}
14+
return k < i ? i - k : k - j;
15+
};
16+
const a = f(x1, x2, xCenter);
17+
const b = f(y1, y2, yCenter);
18+
return a * a + b * b <= radius * radius;
19+
}

0 commit comments

Comments
 (0)