当前位置: 首页 > article >正文

Leetcode 3556. Sum of Largest Prime Substrings

  • Leetcode 3556. Sum of Largest Prime Substrings
    • 1. 解题思路
    • 2. 代码实现
    • 3. 算法优化
  • 题目链接:3556. Sum of Largest Prime Substrings

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 Falsem = min(ceil(math.sqrt(num)) + 1, num)status = [0 for _ in range(m)]for i in range(2, m):if status[i] == 1:continueif num % i == 0:return Falsefor j in range(i, m, i):status[j] = 1return Trueprimes = 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] = 1return primesPRIMES = get_primes(400000)class Solution:def sumOfLargestPrimes(self, s: str) -> int:def is_prime(num):if num == 1:return Falseif num in PRIMES:return Truefor p in PRIMES:if num % p == 0:return Falsereturn Trueprimes = 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。

http://www.lryc.cn/news/2387531.html

相关文章:

  • 以少学习:通过无标签数据从大型语言模型进行知识蒸馏
  • 鸿蒙OSUniApp 实现带有滑动删除的列表#三方框架 #Uniapp
  • Qt qml Network error问题
  • Prompt工程:解锁大语言模型的终极密钥
  • Spring Boot微服务架构(六):伪装的微服务有哪些问题?
  • 恶意npm与VS Code包窃取数据及加密货币资产
  • Matlab快速上手五十六:详解符号运算里假设的用法,通过假设可以设置符号变量的取值范围,也可以通过假设设置变量属于集合:整数、正数和实数等
  • 机器学习笔记【Week1】
  • 什么是3D全景视角?3D全景有什么魅力?
  • 【Mini-F5265-OB开发板试用测评】按键控制测试
  • Debian重装系统后
  • 每日Prompt:古花卷
  • [学习]C语言指针函数与函数指针详解(代码示例)
  • 夏季用电高峰如何防患于未“燃”?电力测温技术守护城市生命线
  • 浙大版《Python 程序设计》题目集6-3,6-4,6-5,6-6列表或元组的数字元素求和及其变式(递归解法)
  • Leetcode 3563. Lexicographically Smallest String After Adjacent Removals
  • 【创造型模式】抽象工厂方法模式
  • 一台手机怎样实现多IP上网?方法有多种
  • 【FFmpeg+SDL】播放音频时,声音正常但是有杂音问题(已解决)
  • Linux 527 重定向 2>1 rsync定时同步(未完)
  • 3DVR拍摄指南:从理论到实践
  • OSI模型中的网络协议
  • 【C/C++】线程局部存储:原理与应用详解
  • 分块查找详解
  • leetcode hot100刷题日记——21.不同路径
  • Elasticsearch 如何实现跨数据中心的数据同步?
  • C语言学习笔记三 --- V
  • 通过JS模板引擎实现动态模块组件(Vite+JS+Handlebars)
  • 梯度消失和梯度爆炸的原因及解决办法
  • 欧拉定理:若 gcd(a,n)=1,则 a^φ(n)≡1(mod n)。