LeetCode算法题-Count Primes(Java实现)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Count Primes(Java实现)

这是悦乐书的第190次更新,第193篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第49题(顺位题号是204)。计算小于非负数n的素数的数量。例如:

输入:10

输出:4

说明:有4个素数小于10,它们是2,3,5,7。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

判断一个数n是否为素数,就需要判断1到n-1之间的数能否被n整除,能够被整除说明不是素数,否则就是素数。


public int countPrimes(int n) {
    if (n = 2) {
        return 0; 
    }
    int count = 0;
    for (int i=2;in; i++) {
        boolean flag = true;
        for (int j=2; ji; j++) {
            if (i%j == 0) {
                flag = false;
            }
        }
        if (flag) {
            count++;
        }
    }
    return count;
}

但是此解法的时间复杂度太高了,是O(n^2),那就需要再优化下。

03 第二种解法

如果n可以被某个数p整除,则n = p×q,并且由于p≤q,我们可以推导出p小于等于根号n。对正整数n,如果用2到根号n之间的所有整数去除,均无法整除,则n为质数。对于根号的处理,我们将内部循环换成指针的平方。


public int countPrimes2(int n) {
   int count = 0;
   for (int i = 1; i  n; i++) {
      if (isPrime(i)) count++;
   }
   return count;
}

private boolean isPrime(int num) {
   if (num = 1) return false;
   for (int i = 2; i * i = num; i++) {
      if (num % i == 0) return false;
   }
   return true;
}

04 第三种解法

一个素数的倍数都不是素数。 比如2,依次往上乘,4,6,8等等,他们都不是质数,再比如3,也可以依次往上乘,得到的结果也不是质数。

我们从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。对此我们需要使用一个长度为n的布尔类型数组,来存储那些被标记的非质数。外层循环和内层循环都是遍历到根号n即可。


public int countPrimes3(int n) {
    boolean[] isPrime = new boolean[n];
    for (int i = 2; i  n; i++) {
        isPrime[i] = true;
    }
    for (int i = 2; i * i  n; i++) {
        if (!isPrime[i])
            continue;
        for (int j = i * i; j  n; j += i) {
            isPrime[j] = false;
        }
    }
    int count = 0;
    for (int i = 2; i  n; i++) {
        if (isPrime[i])
            count++;
    }
    return count;
}

此解法的空间复杂度是O(n),时间复杂度是O(nlog(log n))。

05 小结

算法专题目前已连续日更超过一个月,算法题文章49+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Count Primes(Java实现)

可能你还想看:

LeetCode算法题-Count Primes(Java实现)

原文始发于微信公众号( 悦乐书 ):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Count Primes(Java实现)


 上一篇
LeetCode算法题-Happy Number(Java实现) LeetCode算法题-Happy Number(Java实现)
这是悦乐书的第188次更新,第190篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第47题(顺位题号是202)。编写算法以确定数字是否“幸福”。 幸福数字是由以下过程定义的数字:从任何正整数开始,将数字替换为其
2021-04-05
下一篇 
LeetCode算法题-Remove Linked List Elements LeetCode算法题-Remove Linked List Elements
这是悦乐书的第189次更新,第191篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第48题(顺位题号是203)。移除单链表中节点值为val的节点。例如: 输入:1- 2- 6- 3- 4- 5- 6,val &
2021-04-05