Description#
You are given an integer n
. We say that two integers x
and y
form a prime number pair if:
1 <= x <= y <= n
x + y == n
x
and y
are prime numbers
Return the 2D sorted list of prime number pairs [xi, yi]
. The list should be sorted in increasing order of xi
. If there are no prime number pairs at all, return an empty array.
Note: A prime number is a natural number greater than 1
with only two factors, itself and 1
.
Example 1:
Input: n = 10
Output: [[3,7],[5,5]]
Explanation: In this example, there are two prime pairs that satisfy the criteria.
These pairs are [3,7] and [5,5], and we return them in the sorted order as described in the problem statement.
Example 2:
Input: n = 2
Output: []
Explanation: We can show that there is no prime number pair that gives a sum of 2, so we return an empty array.
Constraints:
Solutions#
Solution 1: Preprocessing + Enumeration#
First, we pre-process all the prime numbers within the range of $n$, and record them in the array $primes$, where $primes[i]$ is true
if $i$ is a prime number.
Next, we enumerate $x$ in the range of $[2, \frac{n}{2}]$. In this case, $y = n - x$. If both $primes[x]$ and $primes[y]$ are true
, then $(x, y)$ is a pair of prime numbers, which is added to the answer.
After the enumeration is complete, we return the answer.
The time complexity is $O(n \log \log n)$ and the space complexity is $O(n)$, where $n$ is the number given in the problem.
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Solution:
def findPrimePairs(self, n: int) -> List[List[int]]:
primes = [True] * n
for i in range(2, n):
if primes[i]:
for j in range(i + i, n, i):
primes[j] = False
ans = []
for x in range(2, n // 2 + 1):
y = n - x
if primes[x] and primes[y]:
ans.append([x, y])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class Solution {
public List<List<Integer>> findPrimePairs(int n) {
boolean[] primes = new boolean[n];
Arrays.fill(primes, true);
for (int i = 2; i < n; ++i) {
if (primes[i]) {
for (int j = i + i; j < n; j += i) {
primes[j] = false;
}
}
}
List<List<Integer>> ans = new ArrayList<>();
for (int x = 2; x <= n / 2; ++x) {
int y = n - x;
if (primes[x] && primes[y]) {
ans.add(List.of(x, y));
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class Solution {
public:
vector<vector<int>> findPrimePairs(int n) {
bool primes[n];
memset(primes, true, sizeof(primes));
for (int i = 2; i < n; ++i) {
if (primes[i]) {
for (int j = i + i; j < n; j += i) {
primes[j] = false;
}
}
}
vector<vector<int>> ans;
for (int x = 2; x <= n / 2; ++x) {
int y = n - x;
if (primes[x] && primes[y]) {
ans.push_back({x, y});
}
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| func findPrimePairs(n int) (ans [][]int) {
primes := make([]bool, n)
for i := range primes {
primes[i] = true
}
for i := 2; i < n; i++ {
if primes[i] {
for j := i + i; j < n; j += i {
primes[j] = false
}
}
}
for x := 2; x <= n/2; x++ {
y := n - x
if primes[x] && primes[y] {
ans = append(ans, []int{x, y})
}
}
return
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| function findPrimePairs(n: number): number[][] {
const primes: boolean[] = new Array(n).fill(true);
for (let i = 2; i < n; ++i) {
if (primes[i]) {
for (let j = i + i; j < n; j += i) {
primes[j] = false;
}
}
}
const ans: number[][] = [];
for (let x = 2; x <= n / 2; ++x) {
const y = n - x;
if (primes[x] && primes[y]) {
ans.push([x, y]);
}
}
return ans;
}
|