[剑指Offer] 33.丑数

题目描述

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

【思路1】递归,超时。。很明显在算到后面的时候每一个数都要算很长时间

 1 bool Is_Ugly_Num(int num)
 2 {
 3     if(num == 1)
 4         return true;
 5     else if(num % 2 == 0)
 6         return Is_Ugly_Num(num/2);
 7     else if(num % 3 == 0)
 8         return Is_Ugly_Num(num/3);
 9     else if(num % 5 == 0)
10         return Is_Ugly_Num(num/5);
11     else
12         return false;
13 
14 }
15 int GetUglyNumber_Solution(int index)
16 {
17     vector<int> res;
18     int num = 1;
19     while(res.size() < index)
20     {
21         if(Is_Ugly_Num(num))
22             res.push_back(num);
23         num ++;
24     }
25     return res[index - 1];
26 }

【思路2】别人家的代码就是好。。。每一个丑数都是前面的丑数乘2、乘3、乘5得来

 1 class Solution
 2 {
 3 public:
 4     int GetUglyNumber_Solution(int index)
 5     {
 6         if(index < 7)  return index;
 7         vector<int> res(index);
 8         res[0] = 1;
 9         int t2 = 0,t3 = 0,t5 = 0;
10         for(int i = 1; i < index; i ++)
11         {
12             res[i] = min(res[t2]*2,min(res[t3]*3,res[t5]*5));
13             if(res[i] == res[t2]*2) t2++;
14             if(res[i] == res[t3]*3) t3++;
15             if(res[i] == res[t5]*5) t5++;
16         }
17         return res[index - 1];
18     }
19 };

 

posted @ 2017-03-06 20:26  Strawberry丶  阅读(159)  评论(0编辑  收藏  举报