Leetcode(204) Count Primes
题目
Description:
Count the number of prime numbers less than a non-negative number, n.
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
Hint:
Let’s start with a isPrime function. To determine if a number is prime, we need to check if it is not divisible by any number less than n. The runtime complexity of isPrime function would be O(n) and hence counting the total prime numbers up to n would be O(n2). Could we do better?
分析
计算小于n的非负整数中素数的个数。
这本是一个简单的题目,直观的反应,就是逐个判断并累计数目,但是直接这样提交的话得到的肯定是TLE的。因为本题的核心便是考察的性能问题。
素数的动态演示,此处给出了素数累计的另一种思路,我们知道任何一个素数的倍数都是合数,从此出发,先初始化一个n个单元的标志数组,将每个元素标记为素数,然后将素数的倍数标志改为false。最后遍历标志数组,得到素数的个数。
下面给出三种实现,方法一是TLE的算法,方法二和方法三核心思想一样,只不过是采用了不同的累计方式,是AC的。
AC代码
class Solution {
public:
//方法一:逐个判断O(n^(3/2))算法,TLE
int countPrimes1(int n) {
int count = 0;
for (int i = 2; i < n; ++i)
{
if (isPrime(i))
++count;
}
return count;
}
bool isPrime(int n)
{
for (int i = 2; i <= sqrt(n); ++i)
if (n % i == 0)
return false;
return true;
}
//方法二:素数不能被比它小的整数整除,建一个标志数组,从2开始,把其倍数小于N的都删掉
int countPrimes2(int n)
{
vector<int> flags(n + 1, 1);
for (int i = 2; i*i <= n; ++i)
{
//把素数的倍数全部设置为非素数标志
if (flags[i])
{
//内层循环从i开始, 比i小的会在以前就被check过
for (int j = i; i*j < n; ++j)
{
flags[i*j] = 0;
}//for
}//for
}//for
int count = 0;
for (int i = 2; i < n; ++i)
{
if (flags[i])
++count;
}
return count;
}
//方法三,与二思路相同,另一种实现方式
int countPrimes(int n)
{
if (n <= 2)
return 0;
vector<int> flags(n, 1);
//记录素数的个数
int count = n - 2;
for (int i = 2; i*i <= n; ++i)
{
if (flags[i])
{
//内层循环从i开始, 比i小的会在以前就被check过
for (int j = i; i*j < n; ++j)
{
//如果原来标记的为素数,现在改为非素数,同时更新素数个数
if (flags[i*j])
{
flags[i*j] = 0;
--count;
}//if
}//for
}//if
}//for
return count;
}
};
Leetcode(204) Count Primes的更多相关文章
- Leetcode(59)-Count Primes
题目: Description: Count the number of prime numbers less than a non-negative number, n. 思路: 题意:求小于给定非 ...
- LeetCode(38) Count and Say
题目 The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111 ...
- Leetcode(5)最长回文子串
Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定一个字符串 s,找到 s 中 最长 的回文子串.你可以假设 s 的最大长度为 1000.' 第一种方法:未完成:利用回文子串的特点 ...
- LeetCode(275)H-Index II
题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...
- LeetCode(220) Contains Duplicate III
题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...
- LeetCode(154) Find Minimum in Rotated Sorted Array II
题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...
- LeetCode(122) Best Time to Buy and Sell Stock II
题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...
- LeetCode(116) Populating Next Right Pointers in Each Node
题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...
- LeetCode(113) Path Sum II
题目 Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given ...
随机推荐
- System.Span, System.Memory,还有System.IO.Pipelines
System.Span, System.Memory,还有System.IO.Pipelines 使用高性能Pipelines构建.NET通讯程序 .NET Standard支持一组新的API,Sys ...
- NET Core应用中如何记录和查看日志
NET Core应用中如何记录和查看日志 日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日 ...
- Ubuntu上源码安装golang并设置开发环境
安装go #wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz #tar -xzf go1.10.3.linux-amd64.tar.g ...
- 079 Word Search 单词搜索
给定一个二维面板和一个单词,找出该单词是否存在于网格中.这个词可由顺序相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用.例如,给定 二 ...
- Json规范
标准格式 书写使用首字母小写驼峰式 {" status":0 //状态 大于0代表正常.小于等于0代表异常 "message":"",/ ...
- WPF机制和原理
最近由于项目需要,自己学习了一下WPF,之前接触过sliverlight,所以对理解和编写XAML不是太陌生.其实XAML和html多少还是有点类似的.只不过XAML上添加上了自动binding机制( ...
- 树莓派2安装Xware实现迅雷远程下载
首先,远程功能很实用,尤其是基于迅雷的,现在国内的下载基本上迅雷只手遮天,别的工具友好程度不理想,这是对于我这种小白来说. 首先,我的树莓派系统不是原生的,我烧写的是ubuntu16,没有桌面,没有多 ...
- SpringMVC的基础配置及视图定位
概要 记录一下搭建SpringMVC框架的步骤 视图定位也就是改变jsp在项目中的路径 一.新建javaweb项目springmvc1,在lib中导入jar包 此项目上传了GitHub,方便去下载ja ...
- Log4j输出格式log4j的PatternLayout参数含义
摘自:http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html 参数 说明 例子 %c 列出logger ...
- java引用数据类型(类)
1 引用数据类型分类 类的类型分两种 1)Java提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供开发者使用.(类的变量是属性) 2)开发者自己创建的类, ...