# 2523. Closest Prime Numbers in Range ###### tags: `Leetcode` `Medium` `Math` `Prime Factors` Link: https://leetcode.com/problems/closest-prime-numbers-in-range/description/ ## 思路 ### 思路一 对于```left```到```right```的每一个数都判断一下是不是prime ```last```表示上一个发现的prime ```diff```表示目前发现的最小的两个prime的差 ```start```表示目前有最小prime差的两个prime中比较小的那一个 不断更新```diff```和```start``` 如果发现遍历完之后```last==-1```或者```start==-1``` 说明没有凑够两个prime 直接返回```[-1,-1]``` 否则返回```[start, start+diff]``` 以上是常规思路 如果按上面的方法做就会TLE 但是可以加一些trick 因为我们知道最小的prime差是1(2和3) 其次是2 prime差是2的prime pairs有很多对 所以我们一旦找到一个prime差小于等于2的pair就可以直接返回 不需要往后找了 ### 思路二 用[Sieve of Eratosthenes](https://www.geeksforgeeks.org/sieve-of-eratosthenes/)方法找到一个范围内的所有prime 然后再用类似思路一的方法找到间隔最小的两个prime ## Code ### 思路一 ```python= class Solution: def closestPrimes(self, left: int, right: int) -> List[int]: def isPrime(num: int) -> bool: if num==1: return False for i in range(2, int(math.sqrt(num))+1): if num%i==0: return False return True last = -1 diff = 1e6 start = -1 for i in range(left, right+1): if not isPrime(i): continue if last!=-1: if diff>i-last: diff = i-last start = last if diff<=2: return [start, start+diff] last = i if last==-1 or start==-1: return [-1, -1] else: return [start, start+diff] ``` ### 思路二 ```python= class Solution: def closestPrimes(self, left: int, right: int) -> List[int]: def sieve(left: int, right: int): prime = [True]*(right+1) prime[0] = False prime[1] = False for i in range(2, int(math.sqrt(right))+1): if prime[i]: for j in range(i*i ,right+1 ,i): prime[j] = False return [i for i in range(left, right+1) if prime[i]] primes = sieve(left, right) if len(primes)<2: return [-1, -1] last = -1 diff = math.inf start = -1 for i in primes: if last!=-1: if diff>i-last: diff = i-last start = last if diff<=2: return [start, start+diff] last = i return [start, start+diff] ```