热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode204题:计数质数

这道题真的是解法很多,但满足时间复杂度的还不太容易想。解法一:暴力法外层循环从2到n,内层循环从2到ni,然后ni取模内

这道题真的是解法很多,但满足时间复杂度的还不太容易想。

解法一:暴力法

外层循环从2到n,内层循环从2到ni,然后ni取模内层循环的值,判断是否为质数。复杂度O(n2),舍弃。

解法二:根据之前的质数求

思路:一个数如果与比它小的所有的质数取模后结果都不为0时,那么此数也是质数。所以,从2开始遍历到n时,每遇到一个质数就将其放到ArrayList中(用ArrayList而不用treeset,因为不需要多余的排序操作)。每次判断一个数是不是质数时,就遍历ArrayList进行取模比较。

虽然比较的次数少了很多了,但遗憾的是依然没通过测试用例。

public static int countPrimes(int n) {if(n <3)return 0;if(n &#61;&#61; 3)return 1;List set&#61;new ArrayList();set.add(2);int flag &#61; 1;for(int i&#61;3;i it &#61; set.iterator();while(it.hasNext()){if(i%it.next()&#61;&#61;0){flag &#61; -1;break;}}if(flag &#61;&#61; 1){set.add(i);}flag &#61; 1;}return set.size();}

解法三&#xff1a;质数折半比较

在解法二中&#xff0c;每次都比较了比当前值小的所有质数。但观察后可以发现&#xff0c;一个数如果与比它小的所有质数的前一半取模都不为0的话&#xff0c;那么就没必要与后一半进行比较了&#xff0c;因为除以小的数得到的数就是大的&#xff0c;所有如果除小的除不尽&#xff0c;那么除大的肯定除不尽。这样又能减少比较次数。

遗憾的是&#xff0c;依然没通过全部的测试用例。好像是卡在1500000了。

public static int countPrimes(int n) {if(n <3)return 0;if(n &#61;&#61; 3)return 1;List set&#61;new ArrayList();set.add(2);int flag &#61; 1;for(int i&#61;3;i it &#61; set.iterator();int mid &#61; set.size();int count &#61; 0;//增加count变量用来折半while(it.hasNext()&&count<&#61;mid/2){if(i%it.next()&#61;&#61;0){flag &#61; -1;break;}count&#43;&#43;;}if(flag &#61;&#61; 1){set.add(i);}flag &#61; 1;}return set.size();}

解法四&#xff1a;根号n比较

解法二中采用的比较前一半的质数的方法复杂度还是不符合要求&#xff0c;那么考虑将n取根号后取整&#xff0c;然后再与ArrayList中小于(int)Math.sqrt(n)的质数进行取模比较&#xff0c;思想其实与解法二是一样的&#xff0c;都是基于除以小的数会得到大的数&#xff0c;而一个数想要被整除并且余数大于除数的话&#xff0c;除数最大就是sqrt(n)&#xff0c;而解法二采用的是质数折半&#xff0c;并不如这种精确。这样就能进一步减少比较次数。

并且&#xff0c;这种方法通过了所有测试用例。

public static int countPrimes(int n) {if(n <3)return 0;if(n &#61;&#61; 3)return 1;List set&#61;new ArrayList();set.add(2);int flag &#61; 1;for(int i&#61;3;i it &#61; set.iterator();int mid &#61; (int)Math.sqrt(n);while(it.hasNext()){int next &#61; it.next();if(next<&#61;mid){if(i%next&#61;&#61;0){flag &#61; -1;break;}}else{break;}}if(flag &#61;&#61; 1){set.add(i);}flag &#61; 1;}return set.size();}

解法五&#xff1a;埃拉托色尼素数筛法

这种算法的思想是&#xff0c;先假定所有的数都是质数&#xff0c;并以布尔型数组存放&#xff08;质数用true表示&#xff09;。然后从2开始迭代&#xff0c;因为默认的都是质数&#xff0c;所以2是质数&#xff0c;那么2的平方及2的平方&#43;2m一定都不是质数&#xff0c;所以把对应不是质数的元素改为false。然后迭代到3&#xff0c;由于默认的是质数&#xff0c;并且之前的2的循环并没有修改3为false&#xff0c;所以3依然是质数&#xff0c;那么同理&#xff0c;3的平方及3的平方&#43;3m也一定都是非质数&#xff0c;故修改为true。以此迭代。

下面的代码是摘抄的网上的。

public static int countPrimes(int n) { //暴力算法是过不了的qwq//这个要用筛法实现boolean[] isPrime &#61; new boolean[n];int result &#61; 0;for (int i &#61; 2; i

下面是n等于100000时四个方法的用时比较&#xff08;除了第一种暴力算法&#xff09;&#xff1a;


推荐阅读
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有