圆圈 题解
题目
在这里。
解题方法
首先这道题目要求有多少个点在半径为
r
r
r的圆里面。
将其转述为,判断一个点
(
x
,
y
)
(x,y)
(x,y)是否在半径为
r
r
r的圆里面。
怎么判断呢?
如下图
我们知道点
(
x
,
y
)
(x,y)
(x,y)处于绿色线和红色线交错的位置。
则红色线的长度是
x
2
+
y
2
\sqrt{x^2+y^2}
x2+y2。
因为红色线的长度等于黑色线的长度,所以我们只需要判断黑色线的长度是否小于等于圆的半径即可,如果满足,就代表此点在圆中。
也就是判断
x
2
+
y
2
≤
r
2
x^2+y^2\leq{r^2}
x2+y2≤r2。
我们只需要从
−
r
-r
−r到
r
r
r用两层循环包暴力断就行了
这样的时间复杂度是
O
(
4
r
2
)
O(4r^2)
O(4r2),不能拿满分。
我们改进算法,假设说我们知道
x
x
x,那么是否可以求出
y
y
y的范围区间
[
l
,
r
]
[l,r]
[l,r]呢?是可以的。
因为
x
2
+
y
2
≤
r
2
x^2+y^2\leq{r^2}
x2+y2≤r2,所以
y
2
≤
r
2
−
x
2
y^2\leq{r^2-x^2}
y2≤r2−x2,则
y
y
y的最大值为
⌊
r
2
−
x
2
⌋
\lfloor{\sqrt{r^2-x^2}}\rfloor
⌊r2−x2⌋。
同理,可以发现最小值就是最大值的相反数,即
y
m
a
x
=
⌊
r
2
−
x
2
⌋
y_{max}=\lfloor{\sqrt{r^2-x^2}}\rfloor
ymax=⌊r2−x2⌋,
y
m
i
n
=
−
⌊
r
2
−
x
2
⌋
y_{min}=-\lfloor{\sqrt{r^2-x^2}}\rfloor
ymin=−⌊r2−x2⌋。
假设
y
=
⌊
r
2
−
x
2
⌋
y=\lfloor{\sqrt{r^2-x^2}}\rfloor
y=⌊r2−x2⌋。
那么可以取
y
+
y
+
1
y+y+1
y+y+1也就是
2
y
+
1
2y+1
2y+1个数。
我们用一次循环枚举
x
x
x并每次求出
y
y
y,然后直接用答案加上
2
y
+
1
2y+1
2y+1就行了。
时间复杂度为
O
(
2
r
)
O(2r)
O(2r)。