【算法刷题-第9题】范围内最接近的两个质数-python-力扣

​​​​​​题目

给你两个正整数 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. 首先了解什么是质数,质数就是除了1和本身以外,没有别的因子,比如2,7,9等

2. 这题首先想的暴力筛质数,怎么个暴力法呢,也就是从2到N,让n与每个遍历的数相除,看看能不能相除的尽

3. 如下暴力代码:

def fn(n):
    sign = True
    for i in range(2,int(n/2+1)):
        if n % i ==0:
            sign = False
            break
    return sign
class Solution:
    def closestPrimes(self, left: int, right: int) -> List[int]:
        lst = []
        for i in range(left,right+1):
            if fn(i):
                lst.append(i)
        print(lst)
        mixn = 100000000
        for i in range(1,len(lst)):
            if lst[i] - lst[i-1] < mixn:
                mixn = lst[i] - lst[i-1]
        for i in range(1,len(lst)):
            if lst[i] - lst[i-1] == mixn:
                return lst[i-1],lst[i]
        return -1,-1

这里为什么是int(n/2+1),其实就是遍历到n的一半就行了,因为n/2 之前的数如果被除尽了,那么在n/2 之后的数据有之配对的

4. 然后肯定是超时的,所以这个时候就需要优化一下代码筛法

5. 首先想到的就是埃氏筛质数,也就是一个质数的倍数一定不是质数,也叫做合数

6. 我们先声明一个全为True的列表,也就是假设全部数都为质数,然后开始遍历

7. 当我们遇到一个质数的时候,就应该把他的所有倍数都筛掉,也就是从当前这个数的之后每过i个数就要被筛掉一次,这个i就是当前的数,相当于每次晒出掉i的倍数

8. 我们将我们筛出来的质数都保存在列表中,然后就暴力枚举,每次连续的两个相比,找出差值最小的,最后再返回两个值就完了

代码

def fn(l,r):
    Max = 10 ** 6+10
    lst = [True] * Max
    res = []
    for i in range(2,r+1):
        if lst[i]:
            res.append(i)
            for j in range(i,r+1,i):
                lst[j] = False   # 改为False,即这个数是合数,被筛掉了
    return res
class Solution:
    def closestPrimes(self, left: int, right: int) -> List[int]:
        lst = fn(left,right)
        l = bisect_left(lst,left)   # 从左往右寻找第一个大于等于left的下标,并且返回
        mixn = 100000000
        for i in range(l+1,len(lst)):
            if lst[i] - lst[i-1] < mixn:
                mixn = lst[i] - lst[i-1]
        for i in range(l+1,len(lst)):
            if lst[i] - lst[i-1] == mixn:
                return lst[i-1],lst[i]
        return -1,-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云辰星.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值