Welcome to Subscribe On Youtube
2761. Prime Pairs With Target Sum
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
andy
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:
1 <= n <= 106
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.
-
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; } }
-
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; } };
-
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
-
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 }
-
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; }