丑数
题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
代码:(超时)
int GetUglyNumber_Solution(int index) { if(index <= 0) return -1; int i = 0; int num = 0; int ans = 0; while(i < index) { num = ans+1; ans = num; while(num) { if(num%2 == 0) num /= 2; else if(num%3 == 0) num /= 3; else if(num%5 == 0) num /= 5; else break; } if(num == 1) i++; } return ans; }
正确的代码:
int GetUglyNumber_Solution(int index) { if(index < 7)return index; vector<int> vec(index+5); vec[1] = 1; int t2 = 1, t3 = 1, t5 = 1; for(int i = 2; i <= index; i++) { vec[i] = min( vec[t2]*2, min(vec[t3]*3,vec[t5]*5) ); if(vec[i] == vec[t2]*2) t2++; if(vec[i] == vec[t3]*3) t3++; if(vec[i] == vec[t5]*5) t5++; } return vec[index]; }
思路:从后向前推理:每一个丑数都是有2,3,5,乘以一个丑数产生。
根据这个思路求出第n个丑数