LeetCode第2523题-范围内最接近的两个质数-java实现-图解思路与手撕代码
一、题目描述
给你两个正整数 left 和 right ,请你找到两个整数 num1 和 num2 ,它们满足:
1、left <= nums1 < nums2 <= right 。
2、nums1 和 nums2 都是 质数 。
3、nums2 - nums1 是满足上述条件的质数对中的最小值 。
请你返回正整数数组 ans = [nums1, nums2] 。如果有多个整数对满足上述条件,请你返回 nums1 最小的质数对。如果不存在符合题意的质数对,请你返回 [-1, -1] 。
如果一个整数大于 1 ,且只能被 1 和它自己整除,那么它是一个质数。
二、解题思路与代码实现
1.解题思路
对[left, right]范围内的所有质数进行条件筛选。
2.代码实现
代码如下(示例):
private static int[] closestPrimes(int left, int right) {
int[] nums = sieveOfEratosthenes(right), res = new int[]{-1, -1};
// System.out.println(Arrays.toString(nums));
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= left) {
if (res[0] == -1 || (i + 1 < nums.length && (nums[i + 1] - nums[i]) < (res[1] - res[0]))) {
res[0] = nums[i];
if (i + 1 < nums.length) {
res[1] = nums[i + 1];
}
}
}
}
if (res[1] > right || res[1] == -1) {
return new int[]{-1, -1};
} else {
return res;
}
}
埃拉托色尼筛选法,返回小于等于n的素数
// 埃拉托色尼筛选法,返回小于等于n的素数
private static int[] sieveOfEratosthenes(int n) {
boolean[] prime = new boolean[n + 1];
int i;
for (i = 2; i <= n; i++) {
prime[i] = true;
}
for (int divisor = 2; divisor * divisor <= n; divisor++) {
if (prime[divisor]) {
for (i = 2 * divisor; i <= n; i = i + divisor) {
prime[i] = false;
}
}
}
List<Integer> res = new LinkedList<>();
for (i = 2; i <= n; i++) {
if (prime[i]) {
res.add(i);
}
}
return res.stream().mapToInt(Integer::valueOf).toArray();
}
欧拉线性筛素数,返回小于等于n的所有素数
// 欧拉线性筛素数,返回小于等于n的所有素数
private static int[] eulerFlagPrime(int n) {
boolean[] flag = new boolean[n + 1];
List<Integer> prime_numbers = new LinkedList<>();
for (int num = 2; num < n + 1; num++) {
if (!flag[num]) {
prime_numbers.add(num);
}
for (int prime : prime_numbers) {
if (num * prime > n) {
break;
}
flag[num * prime] = true;
if (num % prime == 0) {
break;
}
}
}
return prime_numbers.stream().mapToInt(Integer::valueOf).toArray();
}
}
总结
这道题主要是求质数,有了这两种求质数的方法,遇到其他类似题目就不用担心了。