【剑指offer】丑数
2016-07-05 09:20
267 查看
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
leetcode上也有这道题。不过是判断一个数是否为丑数。貌似是我第二道解出来的leetcode,印象还蛮深的。用了递归。
但是这道题是给出第N个丑数。所以如果每个数都判断是否为丑数,比较耗时。剑指offer里看过又忘记了==|||
只记得用数组,根据已经有的丑数去计算,具体的记不清楚了。
1是第一个丑数,第二个丑数由1* 2/3/5中产生,其中最小的既是下一个丑数。——2(接下来的丑数将包含两个2的因子max2+1)
第二个丑数由2* 2/3/5还有上次的1*3/5中产生,最小的3既是下一个丑数。——3(接下来的丑数将包含两个3的因子max3+1)
·
·
·
数组中第N个项既是第N个丑数。
leetcode上也有这道题。不过是判断一个数是否为丑数。貌似是我第二道解出来的leetcode,印象还蛮深的。用了递归。
class Solution { public: bool isUgly(int num) { if (num<=0) return false; if (num==1) return true; if (num%2==0) isUgly(num/2); else if (num%3==0) isUgly(num/3); else if (num%5==0) isUgly(num/5); else return false; } };
但是这道题是给出第N个丑数。所以如果每个数都判断是否为丑数,比较耗时。剑指offer里看过又忘记了==|||
只记得用数组,根据已经有的丑数去计算,具体的记不清楚了。
1是第一个丑数,第二个丑数由1* 2/3/5中产生,其中最小的既是下一个丑数。——2(接下来的丑数将包含两个2的因子max2+1)
第二个丑数由2* 2/3/5还有上次的1*3/5中产生,最小的3既是下一个丑数。——3(接下来的丑数将包含两个3的因子max3+1)
·
·
·
数组中第N个项既是第N个丑数。
class Solution { public: int getMin(int max2,int max3,int max5){ int min = max2<max3?max2:max3; return min<max5?min:max5; } int GetUglyNumber_Solution(int index) { int* Array=new int[index]; Array[0]=1; int *max2 = Array; int *max3 = Array; int *max5 = Array; for(int i=1;i<index;i++){ int min = getMin(*max2*2,*max3*3,*max5*5); Array[i] = min; while(*max2*2 <= Array[i]) ++max2; while(*max3*3 <= Array[i]) ++max3; while(*max5*5 <= Array[i]) ++max5; } return Array[index-1]; } };
相关文章推荐
- 关于使用HTML5本地存储图片的介绍——和派孔明
- js利用正则表达式检验输入内容是否为网址
- 《剑指offer》-数字在排序数组中出现的次数
- 移动web适配利器-rem In CSS3
- js正则表达式
- 前端开发学习路线
- angular js 日期时间插件
- jQuery 命名空间、闭包
- angular js 页面跳转
- angular js 左右选择框 Freemarker+js
- angular js 集合序号处理
- JS小总结
- 《剑指offer》-两个链表的第一个公共结点
- React学习笔记
- jquery dialog 属性详解
- [Sencha ExtJS Modern & Touch] 让长按(taphold/itemtaphold)操作完成后不触发点击(tap/itemtap)事件
- js操作window对象
- html5调用摄像头拍照
- JavaScript事件使用指南
- [React] Using the classnames library for conditional CSS