【算法题】2523. 范围内最靠近的两个质数

分享
源码 2024-9-30 13:09:05 42 0 来自 中国
标题:

给你两个正整数 left 和 right ,请你找到两个整数 num1 和 num2 ,它们满意:
left <= nums1 < nums2 <= right  。
nums1 和 nums2 都是 质数 。
nums2 - nums1 是满意上述条件的质数对中的 最小值 。
请你返回正整数数组 ans = [nums1, nums2] 。如果有多个整数对满意上述条件,请你返回 nums1 最小的质数对。如果不存在符合题意的质数对,请你返回 [-1, -1] 。
如果一个整数大于 1 ,且只能被 1 和它本身整除,那么它是一个质数。
示例 1:
输入:left = 10, right = 19
输出:[11,13]
表明:10 到 19 之间的质数为 11 ,13 ,17 和 19 。
质数对的最小差值是 2 ,[11,13] 和 [17,19] 都可以得到最小差值。
由于 11 比 17 小,我们返回第一个质数对。
示例 2:
输入:left = 4, right = 6
输出:[-1,-1]
表明:给定范围内只有一个质数,以是标题条件无法被满意。
提示:
1 <= left <= right <= 10^6
java 代码:

class Solution {    private final static int MX = (int) 1e6;    private final static int[] primes = new int[78500];    static {        var np = new boolean[MX + 1];        var pi = 0;        for (var i = 2; i <= MX; ++i)            if (!np) {                primes[pi++] = i;                for (var j = i; j <= MX / i; ++j) // 制止溢出的写法                    np[i * j] = true;            }        primes[pi++] = MX + 1;        primes[pi++] = MX + 1; // 包管下面下标不会越界    }    public int[] closestPrimes(int left, int right) {        int p = -1, q = -1;        for (var i = lowerBound(primes, left); primes[i + 1] <= right; ++i)            if (p < 0 || primes[i + 1] - primes < q - p) {                p = primes;                q = primes[i + 1];            }        return new int[]{p, q};    }    private int lowerBound(int[] nums, int target) {        int left = -1, right = nums.length; // 开区间 (left, right)        while (left + 1 < right) { // 区间不为空            // 循环稳固量:            // nums[left] < target            // nums[right] >= target            int mid = left + (right - left) / 2;            if (nums[mid] < target)                left = mid; // 范围缩小到 (mid, right)            else                right = mid; // 范围缩小到 (left, mid)        }        return right;    }}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 00:00, Processed in 0.225905 second(s), 41 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表