【剑指offer】面试题34:丑数
题目:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
第一个丑数是1,此后保存3个下标:乘以2的数位置、乘以3的数位置、乘以5的数位置。每次比较由2、3、5衍生出来的丑数的大小,取最小的作为下一个丑数。
维护这3个下标:判断下一个丑数是由2、3还是5衍生的,那个数的下标位置前进1.
需要注意的是,下一个丑数可能是其中两个或三个数衍生的,比如在生成6时,2衍生的是6,3在那个时候衍生的恰好也是6.这样,2和3的下标都要移动1,否则下一个又生成了一遍6.
代码:
class Solution { public: int GetUglyNumber_Solution(int index) { if(index<=0) return 0; int ugly[index]; int cur=0; ugly[cur++]=1; int index2=0; int index3=0; int index5=0; for(;cur<index;cur++) { ugly[cur]=min(ugly[index2]*2,ugly[index3]*3,ugly[index5]*5); if(ugly[cur]==ugly[index2]*2) index2++; if(ugly[cur]==ugly[index3]*3) index3++;//这里不能用else if,因为可能存在2、3、5衍生的数相等且最小 if(ugly[cur]==ugly[index5]*5) index5++; } return ugly[index-1]; } private: int min(int x, int y, int z) { int res=x<y?x:y; res=res<z?res:z; return res; } };