Description
Solution 1(C++)
class Solution {
public:
int countPrimes(int n) {
vector<bool> isprime(n, true);
isprime[0] = false, isprime[1] = false;
for (int i = 0; i < sqrt(n); ++i) {
if (isprime[i]) {
for (int j = i*i; j < n; j += i) {
isprime[j] = false;
}
}
}
return count(isprime.begin(), isprime.end(), true);
}
};
算法分析
这种算法题,简单经典,直接背下来就好了。
虽然简单,仔细品品还是蛮有意思的。其实该方法能降低算法复杂度,就是通过避免重复。从第二层循环中j+=i。就能看出来,第二层循环是按照i的大小来进行跳跃遍历的。而随着i从小到大,“跳跃”没踩到的地方总会踩到。
程序分析
注意:
isprime[0] = false, isprime[1] = false;
前一个是为了防止死循环。后一个是为了防止算法又变为从0~n的遍历。