问题:
难度:medium
说明:
水题,给出半径 r,和圆心 x, y,然后返回一个点坐标,要求坐标在圆内,其实这个就考一下三角函数
题目连接:https://leetcode.com/problems/generate-random-point-in-a-circle/
输入案例:
Example 1:
Input:
["Solution","pick","pick","pick"]
[[[[1,1,5,5]]],[],[],[]]
Output:
[null,[4,1],[4,1],[3,3]]
Example 2:
Input:
["Solution","pick","pick","pick","pick","pick"]
[[[[-2,-2,-1,-1],[1,0,3,0]]],[],[],[],[],[]]
Output:
[null,[-1,-2],[2,0],[-2,-1],[3,0],[-2,-2]]
我的代码:
坐标都有 x ^2 + y ^ 2 = r0 ^ 2,r0 是坐标对应圆心的半径,在圆内只要 r0 < r 就可以了。
Java:
class Solution {
private double x, y, r, r2;
public Solution(double radius, double x_center, double y_center) {
r = radius;
x = x_center;
y = y_center;
r2 = Math.pow(r, 2);
}
public double[] randPoint() {
while(true) {
double x2 = (Math.random() * 2 - 1) * r;
double y2 = (Math.random() * 2 - 1) * r;
if(Math.pow(x2, 2) + Math.pow(y2, 2) < r2)
return new double[]{x2 + x, y2 + y};
}
}
}
C++:
主要是容易超时,因为 leetcode 起着 debug 来调试你的代码,而且是冷机。
class Solution {
public:
double r, x, y, r2;
vector<double> res{ 0,0 };
Solution(double radius, double x_center, double y_center) {
r = radius;
x = x_center;
y = y_center;
r2 = pow(r, 2);
}
vector<double> randPoint() {
while (true) { // 直接转 double 计算快点
double x2 = (2 * (double)rand() / RAND_MAX - 1.0) * r,
y2 = (2 * (double)rand() / RAND_MAX - 1.0) * r;
if (x2 * x2 + y2 * y2 < r2) {
res[0] = x2 + x, res[1] = y2 + y;
return res;
}
}
}
};