【剑指Offer】33、丑数
题目描述:
把只包含质因子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、丑数的更多相关文章
- 剑指Offer 33. 丑数 (其他)
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题目地 ...
- 剑指 Offer 49. 丑数 + 小根堆 + 动态规划
剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序 ...
- 【剑指Offer】丑数 解题报告
[剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...
- 力扣 - 剑指 Offer 49. 丑数
题目 剑指 Offer 49. 丑数 思路1 丑数是只包含 2.3.5 这三个质因子的数字,同时 1 也是丑数.要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2.3.5,选取出最小 ...
- 【剑指offer】丑数
把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ...
- 【Java】 剑指offer(49) 丑数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number). ...
- Go语言实现:【剑指offer】丑数
该题目来源于牛客网<剑指offer>专题. 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7.习惯上我们把1当做是第一个丑 ...
- 《剑指offer》丑数
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 每日一题 - 剑指 Offer 49. 丑数
题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求 ...
- 剑指OFFER之丑数(九度OJ1214)
题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...
随机推荐
- [Vue-rx] Access Events from Vue.js Templates as RxJS Streams with domStreams
The domStreams component property enables you to access Events from your Vue.js templates as Streams ...
- Linq查询datatable的记录集合
通过linq查询datatable数据集合满足条件的数据集 1.首先定义查询字段的变量,比方深度 string strDepth=查询深度的值: var dataRows = from datarow ...
- CSS3选择器(全)
CSS选择器复习 通用选择器:* 选择到全部的元素 选择子元素:> 选择到元素的直接后代(第一级子元素) 相邻兄弟选择器:+ 选择到紧随目标元素后的第一个元素 普通兄弟选择器:~ 选择到紧随其后 ...
- STL在迭代的过程中,删除指定的元素
直接上Code,上 Picture #include <iostream> #include <list> using namespace std; // STL在迭代的过程中 ...
- 用CSS3实现带有阴影效果和颜色渐变的按钮
这里讲下如何利用css3里的两个新属性 box-shadow和transition来实现如下所示的带有阴影和颜色渐变效果的按钮(下面这个只是图片:本想直接在这个页面下嵌html的,,试了后发现有些cs ...
- JDK框架简析--java.lang包中的基础类库、基础数据类型
题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含 ...
- Skyline V6.6.1安装文件下载及使用
1.下载地址:http://www.skylineglobe.com/skylineglobe/corporate/download/DownloadCenter.aspx 2.安装指南: ...
- BZOJ 1787: [Ahoi2008]Meet 紧急集合 LCA
1787: [Ahoi2008]Meet 紧急集合 Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 ...
- C++源码实现:21种常用设计模式
C++源码实现:21种常用设计模式一直以来在设计模式的学习中,都是出现java的源码,这对学习C++的极度不友好.本工程是基于C++实现21种常用的设计模式,里面包含了实例代码和示例.编写的时候在学习 ...
- Android EditText得到和失去焦点时,自定义处理内容
当android的Edittext得到/失去焦点时,需要自定义一些处理内容时,需要对EditText对象的Focus进行监听处理. 在Activity中,做以下处理: 1.取得EditText对象. ...