LeetCode第2523题-范围内最接近的两个质数-java实现-图解思路与手撕代码

文章介绍了LeetCode的一道题目,要求在给定范围内找到最接近的两个质数,并提供了使用Java实现的解决方案,包括埃拉托色尼筛选法和欧拉线性筛两种求质数的方法。
摘要由CSDN通过智能技术生成

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();
    }
}


总结

这道题主要是求质数,有了这两种求质数的方法,遇到其他类似题目就不用担心了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值