热门标签 | 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;


推荐阅读
  • 本文介绍了如何利用OpenCV库进行图像的边缘检测,并通过Canny算法提取图像中的边缘。随后,文章详细说明了如何识别图像中的特定形状(如矩形),并应用四点变换技术对目标区域进行透视校正。 ... [详细]
  • 本文深入探讨了动态赋值的概念及其在编程实践中的应用,特别是通过Java代码示例来展示如何利用循环结构动态地为数组分配值。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 本文将详细介绍如何使用Java编程语言生成指定数量的不重复随机数,包括具体的实现方法和代码示例。适合初学者和有一定基础的开发者参考。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • 贡献转移在计算每个元素的作用的时候,我们可以通过反向枚举作用效果,添加到作用元素的身上,这种方法叫做贡献转移。更正式的说, ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
  • 二叉搜索树转换为排序双向链表的面试题解析
    本文探讨了一道经典的面试问题,即将给定的一棵二叉搜索树转换为一个排序的双向链表,过程中不允许创建新节点,仅能通过调整现有节点的指针来实现转换。 ... [详细]
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社区 版权所有