尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【LeetCode 204. 计数质数】从暴力枚举到埃拉托斯特尼筛法
如果你也是因为超时问题而来请跳转至【LeetCode 204. 计数质数】从暴力枚举到打表预处理题目描述给定整数 n 返回所有小于非负整数 n 的质数的数量。示例 1 输入n 10 输出4 解释小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 示例 2 输入n 0 输出0 示例 3 输入n 1 输出0 提示 0 n 5 * 10^6解题思路演进这道题是经典的数论基础题。根据数据范围 n 5 * 10^6我们可以推导出不同算法的时间复杂度表现。方法一暴力枚举会超时 TLE最直观的想法是遍历从 2 到 n-1 的每一个数字 i然后判断 i 是否为质数。判断质数的方法是尝试用 2 到 sqrt(i) 之间的数字去整除 i。代码实现class Solution { public: bool isPrime(int x) { for (int i 2; i * i x; i) { if (x % i 0) return false; } return true; } int countPrimes(int n) { int ans 0; for (int i 2; i n; i) { if (isPrime(i)) ans; } return ans; } };复杂度分析时间复杂度O(N根号N​)。当N5×106时计算量达到十亿级别在 LeetCode 上必定超时。空间复杂度O1。方法二埃拉托斯特尼筛法Sieve of Eratosthenes既然暴力法会超时我们需要一种更高效的算法。埃拉托斯特尼筛法简称埃氏筛是一种古老且经典的质数筛选算法。核心思想如果 x 是质数那么 x 的倍数2x, 3x, 4x...一定不是质数。我们可以从 2 开始遍历将当前数字的倍数全部标记为“合数”。遍历结束后未被标记的数字就是质数。在实现埃氏筛时有一个极其重要的优化细节内层循环从 i * i 开始而不是 2 * i。for (int j i * i; j n; j i) { isPrime[j] false; }为什么可以从 i * i 开始假设当前遍历到的质数是 i。对于 i 的倍数 i * k如果 k i那么 i * k 必然已经被比 i 更小的质数比如 k 的某个质因数筛选过了。例如当 i 5 时5 * 2 10已被 2 筛掉5 * 3 15已被 3 筛掉5 * 4 20已被 2 筛掉。因此为了避免重复标记重复计算我们从 i * i 开始标记即可这是 i 的倍数中第一个尚未被更小质数标记的数字。代码实现 (C)class Solution { public: int countPrimes(int n) { // 边界条件小于等于 2 的数没有质数 if (n 2) return 0; // 创建布尔数组isPrime[i] 表示数字 i 是否为质数 // 初始默认全部为 true (质数) vectorbool isPrime(n, true); // 0 和 1 不是质数 isPrime[0] false; isPrime[1] false; // 从 2 开始筛只需要遍历到 sqrt(n) 即可 for (int i 2; i * i n; i) { if (isPrime[i]) { // 优化从 i * i 开始标记步长为 i for (int j i * i; j n; j i) { isPrime[j] false; } } } // 统计所有标记为 true 的数字 int count 0; for (int i 2; i n; i) { if (isPrime[i]) count; } return count; } };复杂度分析时间复杂度ONloglogN。这是埃氏筛的经典复杂度非常接近于线性时间对于5×106的数据量可以轻松通过。空间复杂度ON。需要一个长度为N的布尔数组来记录状态。由于 vectorbool 在 C 中经过了位压缩优化实际占用内存非常小。进阶拓展线性筛欧拉筛虽然埃氏筛已经足够优秀但在某些极端情况下可能会提到线性筛欧拉筛。埃氏筛的痛点一个合数可能会被多个质数重复标记。例如 12会被 2 标记一次2 * 6也会被 3 标记一次3 * 4存在冗余计算。线性筛的核心思想保证每个合数只会被它的最小质因数筛掉。这样时间复杂度可以降到严格的O(N)。线性筛代码示例class Solution { public: int countPrimes(int n) { vectorint primes; // 存储已找到的质数 vectorbool isPrime(n, true); // 标记数组 int ans 0; for (int i 2; i n; i) { if (isPrime[i]) { primes.push_back(i); ans; } // 核心用当前质数 primes[j] 去筛 i * primes[j] for (int j 0; j primes.size() i * primes[j] n; j) { isPrime[i * primes[j]] false; // 保证每个合数只被它的最小质因数筛掉 if (i % primes[j] 0) break; } } return ans; } };
RELATED

相关推荐

AI测试效率翻倍:25个Skill拆解测试工作流实战

AI测试效率翻倍:25个Skill拆解测试工作流实战

1. 为什么我把测试工作流拆成了 25 个 Skill先说结论:我日常做 AI 测试和 Agent 开发,真正高频复用的能力,其实就那么二十几个。把它们从"每次重新写提示词"变成"固定下来的 Skill",是我这两年效率提升最明显…

📅 2026/10/1 21:58:38
Magenta 数据集构建指南:用 convert_dir_to_note_sequences 将 MIDI/MusicXML/ABC 批量转换为 NoteSequence TFRecord

Magenta 数据集构建指南:用 convert_dir_to_note_sequences 将 MIDI/MusicXML/ABC 批量转换为 NoteSequence TFRecord

人工智能深度学习音频媒体生成计算机视觉 【免费下载链接】magenta Magenta: Music and Art Generation with Machine Intelligence 项目地址: https://gitcode.com/gh_mirrors/ma/magenta 点击查看 免费下载 导读 本文以 Magenta 仓库中 magenta/scripts/README.…

📅 2026/10/1 21:58:38
智能家居品牌方交付组织的系统架构设计:从人力调度到交付确定性基础设施

智能家居品牌方交付组织的系统架构设计:从人力调度到交付确定性基础设施

一、背景/痛点分析 品牌方B端客户承接交付承诺时,普遍将“找人”等同于“做交付”。初始阶段通过临时群组协调交付工程师,在少量项目内可维持运转。渠道铺开后,订单分散全国,群组模式迅速失效。典型异常包括:响应延迟、…

📅 2026/10/1 21:58:38
MORE NEWS

更多资讯

📰

openrig开放式铝型材机架DIY全攻略:选型、组装与散热实践

一直折腾硬件这些年,我越来越觉得很多设备其实不需要一个“铁盒子”捂得严严实实,尤其是桌面开发机、NAS、软路由、音视频调试设备这类东西。所以当周围朋友开始聊 openrig 这个概念时,我第一反应是:这不就是我们折腾了半天的开放…

📰

Univer表格SDK实战:插件架构、Canvas渲染与单元格权限控制

1. 从一张“只能填指定格子”的表格说起如果你做过企业内部的数据填报系统、在线考试系统或者任何需要“让用户填表但又不许乱改”的产品,大概率遇到过同一个需求:表格里有些单元格是只读的,有些是可编辑的,而且这个规则还得能动态…

📰

LLM推理性能优化:硬件加速器选型与部署实战指南

最近一直在折腾 70B 级别大模型的推理性能优化,在各种 AI 硬件加速器之间来回切换。老实说,很多人对"LLM 硬件加速器"的理解还停在"买张更贵的卡"这个层面,觉得显卡越好,大模型跑得就越快。真实情况远比这个复…

📰

酒店评论中文情感分析实战:基于Word2Vec与SVM的完整流程

简介:面向自然语言处理与文本挖掘入门者的中文情感分析实战资源,以酒店评论为语料,演示从原始评论文本到情感分类结果的完整流程。包内数据规模近2000个文件,以txt格式的正负样本评论为主,另有5个Python脚本和1份说明文…

📰

AI资讯日更工作流:轻量高信噪比信号捕获系统

1. 这不是一份“新闻稿”,而是一套可复用的AI资讯日更工作流“2026-09-22 AI最新资讯日报”——看到这个标题,你第一反应可能是:又一份堆砌链接的每日推送?但作为连续三年每天产出AI领域深度简报的从业者,我必须说&…

📰

Hyper-V 安装 Linux 服务器:网络桥接、增强功能与时间同步实战

在 Hyper-V 上装一台 Linux 服务器,很多人以为点几下"新建虚拟机"就完事了,真正上手才发现坑全在后面:网卡桥接不通、复制粘贴失灵、分辨率卡在 800600、装完发现时间跟宿主机差了八个小时。我自己从 Windows Server 2012 R2 时代的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬