LeetCode第264题目 Ugly Number ll
2016-02-26 17:28
316 查看
Write a program to find the
Ugly numbers are positive numbers whose prime factors only include
Note that
思路
要得到第N个丑陋数,最直接的想法就是从1开始递增循环,直到找到第N个丑陋数,但是这样明显开销太大,而且我们没有用到已经生成的丑陋数的信息。直接在问题一上修改代码就可。
class Solution {
public:
int nthUglyNumber(int n) {
int count = 1;
int number = 0;
while(count <= n){
number++;
if(isUgly(number)){
count++;
}
}
return number;
}
bool isUgly(int num){
if(num<=0){
return false;
}
while(num%2==0) num=num/2;
while(num%3==0) num=num/3;
while(num%5==0) num=num/5;
if(num==1){
return true;
}
else
return false;
}
};
方法二: (感谢原po分享https://segmentfault.com/a/1190000003480992)
我们应该想一个方法,能够顺序的、只生成丑陋数就好了。观察发现,一个丑陋数,一定是某个丑陋数的2、3、5倍,也就是说由他的因子乘以2/3/5得到。但问题在于,小的丑陋数乘5不一定比大的丑陋数乘2要小,我们没法直接使用目前最大的丑陋数来乘2、3、5顺序得到更大的丑陋数。不过,我们可以确定的是,小的丑陋数乘2,肯定小于大的丑陋数乘2。
所以我们使用三个指针,分别记录乘2、3、5得出的目前最大丑陋数,这样我们通过比较这三种最大丑陋数(这里最大是相对于只乘2、只乘3、只乘5三种不同情况下最大的丑陋数),就得到了所有数里最大的丑陋数。
int nthUglyNumber(int n) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
int p2 = 0, p3 = 0, p5 = 0; //这里是2,3,5的三个指针
while(list.size() < n){
int m2 = list.get(p2) * 2;
int m3 = list.get(p3) * 3;
int m5 = list.get(p5) * 5;
int min = Math.min(m2,Math.min(m3,m5));
list.add(min);
if(min == m2) p2++; //指针移动
if(min == m3) p3++;
if(min == m5) p5++;
}
return list.get(list.size()-1);
}
比如 最开始是list中只有 1 ,那么指针p2,p3,p5都会指向1, 然后经过nthUglyNumber(),list中就会加入2
变成 1 2, 此时指针p3,p5指向1 p2指向2.
n-th ugly number.
Ugly numbers are positive numbers whose prime factors only include
2, 3, 5. For example,
1, 2, 3, 4, 5, 6, 8, 9, 10, 12is the sequence of the first
10ugly numbers.
Note that
1is typically treated as an ugly number.
思路
要得到第N个丑陋数,最直接的想法就是从1开始递增循环,直到找到第N个丑陋数,但是这样明显开销太大,而且我们没有用到已经生成的丑陋数的信息。直接在问题一上修改代码就可。
class Solution {
public:
int nthUglyNumber(int n) {
int count = 1;
int number = 0;
while(count <= n){
number++;
if(isUgly(number)){
count++;
}
}
return number;
}
bool isUgly(int num){
if(num<=0){
return false;
}
while(num%2==0) num=num/2;
while(num%3==0) num=num/3;
while(num%5==0) num=num/5;
if(num==1){
return true;
}
else
return false;
}
};
方法二: (感谢原po分享https://segmentfault.com/a/1190000003480992)
我们应该想一个方法,能够顺序的、只生成丑陋数就好了。观察发现,一个丑陋数,一定是某个丑陋数的2、3、5倍,也就是说由他的因子乘以2/3/5得到。但问题在于,小的丑陋数乘5不一定比大的丑陋数乘2要小,我们没法直接使用目前最大的丑陋数来乘2、3、5顺序得到更大的丑陋数。不过,我们可以确定的是,小的丑陋数乘2,肯定小于大的丑陋数乘2。
所以我们使用三个指针,分别记录乘2、3、5得出的目前最大丑陋数,这样我们通过比较这三种最大丑陋数(这里最大是相对于只乘2、只乘3、只乘5三种不同情况下最大的丑陋数),就得到了所有数里最大的丑陋数。
int nthUglyNumber(int n) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
int p2 = 0, p3 = 0, p5 = 0; //这里是2,3,5的三个指针
while(list.size() < n){
int m2 = list.get(p2) * 2;
int m3 = list.get(p3) * 3;
int m5 = list.get(p5) * 5;
int min = Math.min(m2,Math.min(m3,m5));
list.add(min);
if(min == m2) p2++; //指针移动
if(min == m3) p3++;
if(min == m5) p5++;
}
return list.get(list.size()-1);
}
比如 最开始是list中只有 1 ,那么指针p2,p3,p5都会指向1, 然后经过nthUglyNumber(),list中就会加入2
变成 1 2, 此时指针p3,p5指向1 p2指向2.
相关文章推荐
- bitbucket的使用方法教程
- 欢迎使用CSDN-markdown编辑器
- Activity启动模式图文详解:standard, singleTop, singleTask 以及 singleInstance
- 动态生成checkboxGroup
- 算法 之排序
- android之WIFI小车编程详述
- 河南第五届ACM省赛(遥 控 器)(BFS+优先队列)
- 工作中的涉及的权限
- YTU 2453: 我想有套北京的房
- Android中Context详解 ---- 你所不知道的Context
- Oracle函数
- Citrix 2016年的新变化
- Easyui---datagrid编辑单元格及获取编辑前后数据
- Android Context 上下文 你必须知道的一切
- JAVA 无BOM utf8文件编码判断
- ViewStub的具体使用场景,不是万能的
- wdcp 打开网页显示 Apache 2 Test Page powered by CentOS
- 关于mysql修改属性
- android 之TCP客户端编程
- 4275: [ONTAK2015]Badania naukowe DP