美文网首页js css html
【算法题】2523. 范围内最接近的两个质数

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

作者: 程序员小2 | 来源:发表于2023-04-06 08:05 被阅读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[i]) {
                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[i] < q - p) {
                p = primes[i];
                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;
    }
}

相关文章

  • Ox31质数

    给定两个整数和,你需要在闭区间内找到距离最接近的两个相邻质数和(即是最小的),如果存在相同距离的其他相邻质数对,则...

  • RSA算法的加密、解密、签名/验证签名

    RSA算法的加密、解密 实现思路 参考:这里,这里 具体步骤 在给定范围内随机选择两个不相等的质数p和q 计算p和...

  • Android 每日算法:猫扑素数、单词反转

    经典算法集锦,不定时更新 一、素数(质数)算法 定义: 质数(prime number)又称素数,有无限个。质数定...

  • 47.算法->获取n以内所有素数个数

    day1:假期打卡失败,节后继续刷题算法->计数质数[https://leetcode-cn.com/proble...

  • 2019-09-03

    判断一个数是否是质数 求出1-100 范围内的质数

  • 36/100 编程中的预演思维

    2021-10-11 一般编程书籍都会讲到打印指定整数范围内质数的简单算法,在python语言实现是根据定义通过两...

  • 质数算法

    质数的一些定理 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 每个合数都可以写成几个质数相乘的...

  • LeetCode204-Count Primes

    分析 这个题相当于求小于n的所有质数,曾在编程之美中看到过一个求一组质数的算法,叫厄拉多塞筛法,时间复杂度仅有O(...

  • 762. 二进制表示中质数个计算置位(Python)

    题目 难度:★☆☆☆☆类型:数学 给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数...

  • freeCodeCamp 旅途9 - 算法中级

    算法中级:范围内的数字求和 算法中级:区分两个数组 算法中级:瞄准和消灭 算法中级:罗密欧与朱丽叶 算法中级:短线...

网友评论

    本文标题:【算法题】2523. 范围内最接近的两个质数

    本文链接:https://www.haomeiwen.com/subject/ivoyddtx.html