LeetCode-计数质数

计数质数

给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。

示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0

提示:

  • 质数:只能被1和它本身整除的数为质数,0和1不是质数。
  • 0 <= n <= 5 * 106

问题剖析

核心问题就是如何高效率的判断一个数是不是质数。

分析

假如一个数n可以被x整除,商为y,那么x和y中的较小的一个数肯定小于等于n^0.5(也就是n的平方根),所以判断一个数是否为质数,只需要遍历2 - n^0.5之间的数能否被n整除即可,如果可以整除那么n就不是质数,否则就是质数。

撸代码

class Solution:def countPrimes(self, n: int) -> int:def isPrimes(num: int) -> bool:'判断数字num是否为质数'i = 2while i*i <= num:if num % i ==0: return Falsei += 1return Truecount = 0for i in range(2,n):if isPrimes(i): count += 1return count

首先遍历小于n的数字,挨个判断每个数是否为质数。

时间复杂度:

  • 外部循环:遍历从 2 到 n-1 的所有数字,时间复杂度为 O(n)。
  • 内部循环:对于每个数字 i,isPrimes 函数检查是否存在一个小于等于 sqrt(i) 的因子。对于每个 i,这个检查的时间复杂度为 O(sqrt(i))。由于 i 的范围是 2 到 n,平均来看,内部循环的时间复杂度可以粗略估计为 O(sqrt(n))。
    然而,更精确地,内部循环的总时间复杂度是所有 sqrt(i) 的和,即 (\sum_{i=2}^{n-1} \sqrt{i})。这个求和可以近似为 (\int_{2}^{n} \sqrt{x} dx = \frac{2}{3}(n^{3/2} - 2^{3/2})),因此总的时间复杂度为 O(n^(3/2))

空间复杂度

算法中并没有使用额外的大型数据结构,除了几个变量用于计数和迭代。因此,空间复杂度为 O(1),即常数空间复杂度

更优解法:埃拉托斯特尼筛法

class Solution:def countPrimes(self, n: int) -> int:if n < 2: return 0l = [1]*nl[0] = 0l[1] = 0for i in range(2, int(n**0.5+1)):if l[i] == 1:l[i*i:n:i] = [0] * ((n-1-i*i)//i+1)return sum(l)

解法分析:

默认所有数都是质数,并将默认状态(1:质数,0:不是质数)保存在数组,然后查找不是质数的数字。
如题需要查询所有小于n的非负整数质数,那么如果n不是质数,那么n肯定可以被小于等于n0.5的数整除,同理,如果一个小于n的数不是质数,那么它肯定可以被被小于等于n0.5的某个数整除,所以我们只需遍历2 - n^0.5之间的数,并找出这些数的整数倍的数字(不是质数的数字),并修改数字中的状态,最后计算数组的和就是小于n的质数的个数。

时间复杂度

  • 初始化阶段:初始化列表 l 的时间复杂度为 O(n),因为需要设置每个元素的初始值。
  • 筛法遍历:算法从 2 开始,到 sqrt(n) 结束,对于每个未被标记为合数的数字 i,它将从 i*i 开始,每隔 i 个数标记为合数,直到超过 n。每个合数最多被其所有质数因子标记一次,因此,筛法的总时间复杂度接近于 O(n log log n)。
    • 更具体地说,对于每个质数 i,算法执行 O(n/i) 次操作(即标记 i 的倍数)。由于所有小于 n 的质数的倒数之和近似为 log log n,因此总时间复杂度为 O(n log log n)。

综合以上,整个算法的时间复杂度为 O(n log log n)

空间复杂度

算法使用了一个长度为 n 的列表 l 来存储每个数字是否为质数的信息,因此空间复杂度为 O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Java 中,如何进行基本数据类型与其包装类之间的转换?

在Java中&#xff0c;基本数据类型&#xff08;如int, double, boolean等&#xff09;和它们对应的包装类&#xff08;如Integer, Double, Boolean等&#xff09;之间转换是一项常见的操作。 包装类主要是为了方便在需要对象的地方使用基本类型值&#xff0c;比如集合类&#…

解决SpringBoot集成Mybatis 配置多数据源后,打印SQL失效问题

SpringBoot集成Mybati 配置多数据源参考上一篇文章 在Spring框架中使用MyBatis时&#xff0c;如果配置了多数据源&#xff0c;可能会导致之前配置的打印SQL语句的设置失效。这通常是因为在多数据源配置中&#xff0c;MyBatis的SQL打印功能只对默认数据源生效&#xff0c;而对于…

深度学习落地实战:人脸五官定位检测

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …

【LeetCode】162. 寻找峰值

1. 题目 2. 分析 这道题的难点有二&#xff1a;第一&#xff0c;知道用二分法求解&#xff1b;第二&#xff0c;二分判断的标准是什么&#xff1f;传统的题目的二分标注都是跟某个固定的值做比较&#xff0c;但是此题不然。此题的比较对象是相邻的元素。 不要硬凭自己的脑子…

LeetCode第106题:从中序与后序遍历序列构造二叉树的Java实现

摘要 LeetCode第106题要求使用一棵树的中序遍历和后序遍历序列来重建二叉树。本文将介绍两种Java实现方法&#xff1a;递归和迭代。 1. 问题描述 给定一棵树的中序遍历和后序遍历序列&#xff0c;重建出这棵树的唯一二叉树结构。 2. 示例分析 输入&#xff1a;[1,2,4]&…

C语言·函数(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下函数的知识点&#xff0c;我们一起来看看吧&#xff01; 目录 一、函数是什么 &a…

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

execv函数简单使用

在Unix-like系统中&#xff0c;execv 函数用于执行一个新的程序&#xff0c;同时可以传递参数给它。这个函数是 exec 系列函数之一&#xff0c;用于替换当前进程映像。 execv 的原型如下&#xff1a; int execv(const char *path, char *const argv[]); path&#xff1a;新程…

【边缘计算网关教程】9.对接ThingsBoard(MQTT协议)

前景回顾-【边缘计算网关教程】8.ModbusTCP采集存储Influxdb-CSDN博客 目录 需求分析 平台配置&#xff1a; 需求实现 第一步&#xff1a;采集Modbus TCP数据 第二步&#xff1a;拼接Json 第三步&#xff1a;MQTT上报 平台配置 第一步&#xff1a;添加设备 ​编辑第二…

国内新能源汽车芯片自给,承认差距,任重道远

【科技明说 &#xff5c; 科技热点关注】 据近日工信部电子五所元器件与材料研究院高级副院长罗道军表示&#xff0c;中国拥有最大的新能源车产能&#xff0c;芯片用量也是越来越多。但是芯片的自给率目前不到10%&#xff0c;是结构性的短缺。 中国拥有最大新能源车产能&#…

自学网络安全:从菜鸟到守护者的蜕变之旅

在这个数字化时代&#xff0c;网络安全不再是遥不可及的专业术语&#xff0c;而是与我们每个人的生活息息相关。随着网络攻击事件的频发&#xff0c;掌握一定的网络安全知识&#xff0c;不仅是对个人隐私的保护&#xff0c;更是对社会安全的贡献。今天&#xff0c;就让我们一起…

从太阳神到弥勒佛

对于学习英语的人来说&#xff0c;太阳神&#xff0c;最为知名的&#xff0c;就是阿波罗&#xff08;Apollo&#xff09;&#xff0c;人类最近的历史&#xff0c;最知名的&#xff0c;就是阿波罗计划。 说白了&#xff0c;阿波罗计划&#xff0c;这个音译词&#xff0c;对于英语…

用Docker来开发

未完成。。。 现在好像用Docker是越来越多了。之前其实也看过docker的原理&#xff0c;大概就是cgroup那些&#xff0c;不过现在就不看原理了&#xff0c;不谈理论&#xff0c;只看实际中怎么用&#xff0c;解决眼前问题。 用docker来做开发&#xff0c;其实就是解决的编译环境…

InceptionV3代码实现(Pytorch)

文章目录 Inception介绍InceptionV3代码实现第一步&#xff1a;定义基础卷积模块第二步&#xff1a;定义Inceptionv3模块InceptionAInceptionBInceptionCInceptionDInceptionE 第三步&#xff1a;定义辅助分类器InceptionAux第四步&#xff1a;搭建GoogLeNet网络第五步*&#x…

请你谈谈:spring bean的生命周期 - 阶段3:属性赋值(设置属性)

2024/07/17 22:17 : 两天内完成&#xff0c;敬请期待&#xff01;&#xff01;&#xff01; Spring属性赋值阶段是Spring Bean生命周期中的一个重要阶段&#xff0c;它紧随Bean的实例化之后。在这个阶段&#xff0c;Spring容器会根据BeanDefinition中定义的属性配置&#xff0…

使用 git 和 GitHub 互动

本文根据《GitHub入门与实践》整理 创建账户 要想使用GitHub那就必须先有GitHub账号,账号自行注册,不作介绍。 本地生成 SSH Key SSH 提供了一种安全的方式来通过不安全的网络进行通信。当你使用SSH key连接到GitHub时,你的身份是通过密钥对(一个公钥和一个私钥)来验…

PJA1介导的焦亡抑制是鼻咽癌产生耐药性的驱动因素

引用信息 文 章&#xff1a;PJA1-mediated suppression of pyroptosis as a driver of docetaxel resistance in nasopharyngeal carcinoma. 期 刊&#xff1a;Nature Communications&#xff08;影响因子&#xff1a;14.7&#xff09; 发表时间&#xff1a;2024年6月2…

unity 把Vuforia的Image做成预制件prefab后,通过ab加载或者其他动态加载后,扫描图片不会出现模型

//通过ab加载资源&#xff08;自己封装的ab加载的脚本&#xff09;GameObject go LoadHandle.Instance.LoadPrefab.LoadPrefabAssets("ImagePrefab");GameObject game GameObject.Instantiate(go);//加载预制件后&#xff0c;加载图片的数据库// 初始化 Vuforia I…

Lua 数组

Lua 数组 Lua 是一种轻量级的编程语言&#xff0c;广泛用于游戏开发、脚本编写和其他应用程序。在 Lua 中&#xff0c;数组是一种非常基础和重要的数据结构。本文将详细介绍 Lua 数组的概念、用法和操作方法。 数组的概念 在 Lua 中&#xff0c;数组实际上是一个列表&#x…

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明&#xff0c;所以在此借花献佛&#xff0c;使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目&#xff0c;fork到github以及gitee中&#xff0c;然后拉取到本地 后端代码&#xff1a; https://gitee.com/jelex/mall-swarm.gi…