题目:
给你两个正整数 left 和 right ,请你找到两个整数 num1 和 num2 ,它们满足:
left <= nums1 < nums2 <= right。nums1和nums2都是 质数 。nums2 - nums1是满足上述条件的质数对中的 最小值 。
请你返回正整数数组 ans = [nums1, nums2] 。如果有多个整数对满足上述条件,请你返回 nums1 最小的质数对。如果不存在符合题意的质数对,请你返回 [-1, -1] 。
如果一个整数大于 1 ,且只能被 1 和它自己整除,那么它是一个质数。
算法:
方法一:暴力枚举
超时了
func closestPrimes(left int, right int) []int {
primes := make([]int, 0)
for i := left; i <= right; i ++ {
if isPrime(i){
primes = append(primes, i)
}
}
if len(primes) < 2 {
return []int{-1, -1}
}
minVal := math.MaxInt32
n := len(primes)
ans := make([]int, 2)
for i := 1; i < n ; i ++ {
if primes[i] - primes[i - 1] < minVal {
minVal = primes[i] - primes[i - 1]
ans[0] = primes[i - 1]
ans[1] = primes[i]
}
}
// fmt.Println(primes)
return ans
}
func isPrime(n int) bool {
if n == 1 {
return false
}
for i := 2; i * i <= n; i ++ {
if n % i == 0 {
return false
}
}
return true
}
方法二:埃式筛
这个方法还是得掌握一下
var isPrime []bool
func closestPrimes(left int, right int) []int {
isPrime = make([]bool, right + 1)
for i := 2; i < len(isPrime); i ++ {
isPrime[i] = true
}
for i := 2; i <= right; i++ {
if isPrime[i] {
for j := 2 * i; j <= right; j += i {
isPrime[j] = false
}
}
}
primes := make([]int, 0)
for i := left; i <= right; i ++ {
if isPrime[i]{
primes = append(primes, i)
}
}
if len(primes) < 2 {
return []int{-1, -1}
}
minVal := math.MaxInt32
n := len(primes)
ans := make([]int, 2)
for i := 1; i < n ; i ++ {
if primes[i] - primes[i - 1] < minVal {
minVal = primes[i] - primes[i - 1]
ans[0] = primes[i - 1]
ans[1] = primes[i]
}
}
// fmt.Println(primes)
return ans
}