题目描述
把只包含因子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 };