• 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;i<n; i++) {
            boolean flag = true;
            for (int j=2; j<i; 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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    asp.net mvc 国际化(2) 解决问题
    asp.net mvc 国际化(1) 国际化的基础
    Silverlight自学笔记布局基础
    ASP.NET MVC form验证
    Expression Tree 入门
    JQuery 思维导图
    HashMap的Put方法(二)
    HashMap的构造函数(三)
    HashMap的数据结构(一)
    HashMap之扩容resize(四)
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10056919.html
Copyright © 2020-2023  润新知