Leetcode 3556. Sum of Largest Prime Substrings

发布于:2025-05-27 ⋅ 阅读:(36) ⋅ 点赞:(0)

1. 解题思路

这一题毕竟只是这一次双周赛的第一题,虽然标记为medium的题目,但是思路上还是非常简单的,只需要对所有的数字进行一下遍历,然后考察一下其是否为质数即可。

虽然这样遍历的算法复杂度会是 O ( N 2 ) O(N^2) O(N2),但由于数字的最大位数只有10位,因此无伤大雅。

问题的真正麻烦的在于对任意一个数如何判断它是否是质数,如果真的暴力去求解,那么需要的时间复杂度就会是 O ( N l o g N ) O(NlogN) O(NlogN),其中 N N N是数的大小,考虑到 N N N可能是一个10位数,这显然太大了,因此我们需要对这个进行一下优化,具体来说就是对 N N N进行一下开方,只要比 N \sqrt{N} N 小的所有质数均无法整除 N N N,那么 N N N必为一个质数。

2. 代码实现

给出python代码实现如下:

class Solution:
    def sumOfLargestPrimes(self, s: str) -> int:
        
        def is_prime(num):
            if num == 1:
                return False
            m = min(ceil(math.sqrt(num)) + 1, num)
            status = [0 for _ in range(m)]
            for i in range(2, m):
                if status[i] == 1:
                    continue
                if num % i == 0:
                    return False
                for j in range(i, m, i):
                    status[j] = 1
            return True
        
        primes = set()
        n = len(s)
        for i in range(n):
            for j in range(i+1, n+1):
                num = int(s[i:j])
                if is_prime(num):
                    primes.add(num)
        primes = sorted(primes, reverse=True)[:3]
        return sum(primes) if len(primes) > 0 else 0

提交代码评测得到:耗时1560ms,占用内存18.7MB。

3. 算法优化

进一步的,我们可以将质数的计算部分提取出来作为global变量,这样可以进一步减少重复计算,从而优化效率。

给出优化后的代码实现如下:

def get_primes(n):
    primes = set()
    status = [0 for _ in range(n+1)]
    for i in range(2, n+1):
        if status[i] == 0:
            primes.add(i)
        for j in range(i, n+1, i):
            status[j] = 1
    return primes

PRIMES = get_primes(400000)

class Solution:
    def sumOfLargestPrimes(self, s: str) -> int:
        
        def is_prime(num):
            if num == 1:
                return False
            if num in PRIMES:
                return True
            for p in PRIMES:
                if num % p == 0:
                    return False
            return True
        
        primes = set()
        n = len(s)
        for i in range(n):
            for j in range(i+1, n+1):
                num = int(s[i:j])
                if is_prime(num):
                    primes.add(num)
        primes = sorted(primes, reverse=True)[:3]
        return sum(primes) if len(primes) > 0 else 0

提交代码评测得到:耗时806ms,占用内存23.9MB。