leetcode题目 质数问题
Description:
Count the number of prime numbers less than a non-negative number, n
解决方案:
class Solution {
public:
int countPrimes(int n) {
bool *p=new bool[n];
for(int i=1;i<=n-1;i+=2)
{
p[i]=true;
}
int num=(n-1)-(n-1)/2; //减去1和包含的偶数个数(除了2以外)
for(int i=3;i<=(n-1)/2;i+=2) //这里i只要到(n-1)/2就可以了 因为一半以后的数乘j必然大于n-1
{
for(int j=3;j*i<=n-1;j+=2)
{
if(p[j*i]==true) //最开始没有加这个判断,结果会num重复减去很多
{
p[j*i]=false;
num-=1;
}
}
}
if(n==1 || n==0 || n==2) return 0;
delete[] p;
return num;
}
};
运行时间56ms
最开始一直想办法从素数的判断方法下手(即判断从2到根号i之间有没有可以整除i的数,有就说明i为质数), 这个思路比较清晰明了,结果运行在1500000处超出时间限制。虽然从正面考虑做了一点优化但是仍然是超出时间限制。
从反面角度考虑会在时间上有很大的改进,一开始认为这n-1个数都是素数,然后减去1和所有的偶数的个数,之后再逐步减去非素数的个数,这里需要一个辅助数组lable,为了防止num重复减(甚至出现负数)。这里要在所有奇数上操作,因为偶数乘一个数必然为奇数。