链接
思路 :
1 . 质数筛(欧拉筛/线性筛均可)
2 . 如果n为奇数 , 奇数=奇数+偶数,那么只有可能是{2 , n - 2}
3 . n为偶数的话,直接暴力即可;
1e6内最多有78498个质数
代码 :
/*
* @lc app=leetcode.cn id=2761 lang=java
*
* [2761] 和等于目标值的质数对
*/
// @lc code=start
import java.util.ArrayList;
import java.util.List;
class Solution {
private final static int MX = (int)1e6 ;
private final static int[] primes = new int[78498] ;
private final static boolean[] np = new boolean[MX + 1] ;
static{
int pi = 0 ;
for(int i=2;i<=MX;i++){
if(!np[i]){
primes[pi++] = i ;
for(int j=i;j<=MX/i;j++){// 避免溢出的写法
np[i*j] = true ;
}
}
}
}
public List<List<Integer>> findPrimePairs(int n) {
List<List<Integer>> ans = new ArrayList<List<Integer>>() ;
if(n%2==1){
return n>4 && !np[n-2] ? List.of(List.of(2,n-2)) : List.of() ;
}
for(int x : primes){
int y = n - x ;
if(y<x) break ;
if(!np[y]) ans.add(List.of(x,y)) ;
}
return ans ;
}
}
// @lc code=end