6280. 范围内最接近的两个质数

191 阅读1分钟

题目:
给你两个正整数 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
}