[LeetCode] 2523. Closest Prime Numbers in Range
Problem
https://leetcode.com/problems/closest-prime-numbers-in-range/description/
Leetcode - Closest Prime Numbers in Range
Type - Math, Number Theory
Difficulty - Medium
Approach & Solution
Examine the sequences prime numbers.
To get the minimum gap, only comparing adjacent prime numbers is efficient.
data structure and variables:
isPrime
: Sieve of Eratosthenes - A boolean array.lastPrime
: last encountered prime number.minGap
: minimum gap between two adjacent pairs.ans
: stores pairnum1
andnum2
.
By maintaining lastPrime
and updating minGap
dynamically, we can efficiently determine the closest prime pair.
Complexity
Time Complexity: O(right log log right)
- Sieve of Eratosthenes.
Space Complexity: O(right)
- Sieve of Eratosthenes.
Code (C++ | Go)
#pragma GCC optimize("O3", "unroll-loops");
static const int __ = [](){
ios_base::sync_with_stdio(0);
cin.tie(0);
return 0;
}();
class Solution {
public:
vector<int> closestPrimes(int left, int right) {
vector<bool> isPrime(right+1, true);
int lastPrime = INT_MIN;
int minGap = INT_MAX;
vector<int> ans = {-1, -1};
isPrime[0] = false;
isPrime[1] = false;
for(int i = 2; i <= right; i++) {
if(!isPrime[i]) continue;
for(int j = i*2; j <= right; j += i) {
isPrime[j] = false;
}
if(i >= left) {
if(lastPrime > 0) {
if(i - lastPrime < minGap) {
minGap = i - lastPrime;
ans = {lastPrime, i};
}
}
lastPrime = i;
}
}
return ans;
}
};
func closestPrimes(left int, right int) []int {
isPrime := make([]bool, right+1)
minGap := math.MaxInt
lastPrime := -1
ans := []int{-1, -1}
for i := 2; i <= right; i++ {
isPrime[i] = true
}
for i := 2; i <= right; i++ {
if !isPrime[i] {
continue
}
for j := i*2; j <= right; j += i {
isPrime[j] = false
}
if i >= left {
if lastPrime > 0 {
if i - lastPrime < minGap {
minGap = i - lastPrime
ans[0] = lastPrime
ans[1] = i
}
}
lastPrime = i
}
}
return ans
}