题目描述:

  把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

  解题思路:

  所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0。据此,本题有以下两种解法:

  方法一:逐个判断每个整数是不是丑数

  丑数只能被2、3、5整除,也就是说,如果一个数能被2整除,就连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就连续除以5;如果最后得到的是1,那么这个数就是丑数,否则不是。由此,按照顺序依次判断每个整数,并进行计数,就可以找到第N个丑数。这种方法简单直观,但是需要判断每一个整数,不够高效。

  方法二:创建数组保存已经找到的丑数,用空间换时间

  为了提高效率,我们可以只计算丑数,不在非丑数上浪费时间。根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此,我们可以创建一个数组,里面保存的是排好序的丑数,每一个丑数都可以由前面的丑数乘以2、3或者5得到。

  这个思路的关键在于如何保证数组里的丑数都是排好序的,也就是每次怎样生成新的丑数。对乘以2而言,肯定存在某个丑数M2,排在它之前的所有丑数乘以2都会小于已有的最大丑数,在它之后的丑数乘以2都会比他大。而对乘以3和5而言,也存在同样的M3和M5,因此只需要维护三个索引值即可判断下一次生成的丑数应该是多少。

  编程实现(Java):

public class Solution {
public int GetUglyNumber_Solution(int index) {
/*思路:两种方法:
(1)依次判断丑数只包含质因子2,3,5,连续除以2,连续处于3,连续除以5,最终得到1说明是丑数
(2)空间换时间,丑数应该是另外一个丑数乘以2,3,5的结果,因此用一个数组保存排好序的丑数,依次计算下一个丑数 */
if(index<1)
return 0;
int[] pUglyNumbers=new int[index]; //依次保存第n个丑数
pUglyNumbers[0]=1; //第一个丑数是1
int pMultiply2=0,pMultiply3=0,pMultiply5=0; for(int i=1;i<index;i++){
int min=getMin(pUglyNumbers[pMultiply2]*2,pUglyNumbers[pMultiply3]*3,
pUglyNumbers[pMultiply5]*5);
pUglyNumbers[i]=min;
while(pUglyNumbers[pMultiply2]*2<=min)
pMultiply2++;
while(pUglyNumbers[pMultiply3]*3<=min)
pMultiply3++;
while(pUglyNumbers[pMultiply5]*5<=min)
pMultiply5++;
}
return pUglyNumbers[index-1];
}
public int getMin(int a,int b,int c){
int min=a>b?b:a;
return c<min?c:min;
}
}

【剑指Offer】33、丑数的更多相关文章

  1. 剑指Offer 33. 丑数 (其他)

    题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题目地 ...

  2. 剑指 Offer 49. 丑数 + 小根堆 + 动态规划

    剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序 ...

  3. 【剑指Offer】丑数 解题报告

    [剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...

  4. 力扣 - 剑指 Offer 49. 丑数

    题目 剑指 Offer 49. 丑数 思路1 丑数是只包含 2.3.5 这三个质因子的数字,同时 1 也是丑数.要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2.3.5,选取出最小 ...

  5. 【剑指offer】丑数

    把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ...

  6. 【Java】 剑指offer(49) 丑数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number). ...

  7. Go语言实现:【剑指offer】丑数

    该题目来源于牛客网<剑指offer>专题. 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7.习惯上我们把1当做是第一个丑 ...

  8. 《剑指offer》丑数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  9. 每日一题 - 剑指 Offer 49. 丑数

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求 ...

  10. 剑指OFFER之丑数(九度OJ1214)

    题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...

随机推荐

  1. AngularJS:让submit重新生效

    当我们在html中声明了ng-app后,form的submit就会失效,必须通过angularJS来处理.如果这时还是想用普通的方式提交的话,需要修改form标签,如下所示: <form met ...

  2. source 命令的用法,是在当前bash环境下执行脚本文件

    原文: http://www.cnblogs.com/softwaretesting/archive/2012/02/13/2349550.html source命令用法: source FileNa ...

  3. [React Testing] Confidently Ship Production React Apps

    We want to make sure that when we ship new code, our users can use the application. The best way we' ...

  4. kendo AutoComplete实现多筛选条件

    kendo autoComplete 原始情况下是不支持多筛选条件的 $("#autocomplete").kendoAutoComplete({ filter: "co ...

  5. hdu1542 线段树+扫描线+离散化

    仅仅想说题目给的欲实际不服     还是这类型的水题吧   建议看之前我写的那个 #include<stdio.h> #include<string.h> #include&l ...

  6. 您必须先调用“WebSecurity.InitializeDatabaseConnection”方法。。。

    有如下代码: [Authorize] public ActionResult Index() { ViewBag.ShowList = ShowList.GetShowList(WebSecurity ...

  7. 虚函数的特点就是执行的时候会下降到子类去执行同名覆盖函数 good

    var t: TBitBtn;begin t:=TBitBtn.Create(nil); t.Name:='BitBtn100'; t.parent :=Self; // 这里下断点end; 一路跟踪 ...

  8. inux内核模块编程入门

    linux内核模块编程入门 2013-07-06 23:59:54 分类: LINUX 原文地址:linux内核模块编程入门 作者:s270768095 模块编程属于内核编程,因此,除了对内核相关知识 ...

  9. 在MTK平台里,,函数kal_prompt_trace起什么作用???Kal_prompt_trace的参数有表示什么?

    在MTK平台里,,函数kal_prompt_trace起什么作用???Kal_prompt_trace的参数有表示什么?一直弄不明白,但是很多函数的开头就是这个函数,,而且一般有三个参数-- kal_ ...

  10. Winform设计-小百货 涵盖基础插件学习(适合新手)

    Winform设计-小百货 涵盖基础插件学习(适合新手)   第一次写winform,主要是为了加快对  事件的 理解. 代码如下: private void Form1_Load(object se ...