Overflow in intermediate arithmetic
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.
Move from brute-force thinking to an efficient approach using math strategy.
Given the radius and the position of the center of a circle, implement the function randPoint which generates a uniform random point inside the circle.
Implement the Solution class:
Solution(double radius, double x_center, double y_center) initializes the object with the radius of the circle radius and the position of the center (x_center, y_center).randPoint() returns a random point inside the circle. A point on the circumference of the circle is considered to be in the circle. The answer is returned as an array [x, y].Example 1:
Input ["Solution", "randPoint", "randPoint", "randPoint"] [[1.0, 0.0, 0.0], [], [], []] Output [null, [-0.02493, -0.38077], [0.82314, 0.38945], [0.36572, 0.17248]] Explanation Solution solution = new Solution(1.0, 0.0, 0.0); solution.randPoint(); // return [-0.02493, -0.38077] solution.randPoint(); // return [0.82314, 0.38945] solution.randPoint(); // return [0.36572, 0.17248]
Constraints:
0 < radius <= 108-107 <= x_center, y_center <= 1073 * 104 calls will be made to randPoint.Problem summary: Given the radius and the position of the center of a circle, implement the function randPoint which generates a uniform random point inside the circle. Implement the Solution class: Solution(double radius, double x_center, double y_center) initializes the object with the radius of the circle radius and the position of the center (x_center, y_center). randPoint() returns a random point inside the circle. A point on the circumference of the circle is considered to be in the circle. The answer is returned as an array [x, y].
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Math
["Solution","randPoint","randPoint","randPoint"] [[1.0,0.0,0.0],[],[],[]]
random-point-in-non-overlapping-rectangles)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #478: Generate Random Point in a Circle
class Solution {
public Solution(double radius, double x_center, double y_center) {
this.radius = radius;
this.x_center = x_center;
this.y_center = y_center;
}
public double[] randPoint() {
final double length = Math.sqrt(Math.random()) * radius;
final double degree = Math.random() * 2 * Math.PI;
final double x = x_center + length * Math.cos(degree);
final double y = y_center + length * Math.sin(degree);
return new double[] {x, y};
}
private double radius;
private double x_center;
private double y_center;
}
// Accepted solution for LeetCode #478: Generate Random Point in a Circle
// Auto-generated Go example from java.
func exampleSolution() {
}
// Reference (java):
// // Accepted solution for LeetCode #478: Generate Random Point in a Circle
// class Solution {
// public Solution(double radius, double x_center, double y_center) {
// this.radius = radius;
// this.x_center = x_center;
// this.y_center = y_center;
// }
//
// public double[] randPoint() {
// final double length = Math.sqrt(Math.random()) * radius;
// final double degree = Math.random() * 2 * Math.PI;
// final double x = x_center + length * Math.cos(degree);
// final double y = y_center + length * Math.sin(degree);
// return new double[] {x, y};
// }
//
// private double radius;
// private double x_center;
// private double y_center;
// }
# Accepted solution for LeetCode #478: Generate Random Point in a Circle
class Solution:
def __init__(self, radius: float, x_center: float, y_center: float):
self.radius = radius
self.x_center = x_center
self.y_center = y_center
def randPoint(self) -> List[float]:
length = math.sqrt(random.uniform(0, self.radius**2))
degree = random.uniform(0, 1) * 2 * math.pi
x = self.x_center + length * math.cos(degree)
y = self.y_center + length * math.sin(degree)
return [x, y]
// Accepted solution for LeetCode #478: Generate Random Point in a Circle
use rand::prelude::*;
struct Solution {
radius: f64,
x_center: f64,
y_center: f64,
rng: ThreadRng,
}
impl Solution {
fn new(radius: f64, x_center: f64, y_center: f64) -> Self {
let rng = rand::thread_rng();
Solution {
radius,
x_center,
y_center,
rng,
}
}
fn rand_point(&mut self) -> Vec<f64> {
let mut x = self.rng.gen_range(-self.radius, self.radius);
let mut y = self.rng.gen_range(-self.radius, self.radius);
while x * x + y * y > self.radius * self.radius {
x = self.rng.gen_range(-self.radius, self.radius);
y = self.rng.gen_range(-self.radius, self.radius);
}
vec![x + self.x_center, y + self.y_center]
}
}
// Accepted solution for LeetCode #478: Generate Random Point in a Circle
// Auto-generated TypeScript example from java.
function exampleSolution(): void {
}
// Reference (java):
// // Accepted solution for LeetCode #478: Generate Random Point in a Circle
// class Solution {
// public Solution(double radius, double x_center, double y_center) {
// this.radius = radius;
// this.x_center = x_center;
// this.y_center = y_center;
// }
//
// public double[] randPoint() {
// final double length = Math.sqrt(Math.random()) * radius;
// final double degree = Math.random() * 2 * Math.PI;
// final double x = x_center + length * Math.cos(degree);
// final double y = y_center + length * Math.sin(degree);
// return new double[] {x, y};
// }
//
// private double radius;
// private double x_center;
// private double y_center;
// }
Use this to step through a reusable interview workflow for this problem.
Simulate the process step by step — multiply n times, check each number up to n, or iterate through all possibilities. Each step is O(1), but doing it n times gives O(n). No extra space needed since we just track running state.
Math problems often have a closed-form or O(log n) solution hidden behind an O(n) simulation. Modular arithmetic, fast exponentiation (repeated squaring), GCD (Euclidean algorithm), and number theory properties can dramatically reduce complexity.
Review these before coding to avoid predictable interview regressions.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.