剑指offer:丑数
题目描述:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:
1. 常规思路,从1开始到index判断每个数是否是丑数,但这样时间上肯定过不了,因为存在重复计算。
2. 用空间换时间的思路,发现每一个丑数都是由之前的丑数乘2,3或5得到的,所以考虑从第一个丑数开始向后推到第index个。由于需要维持一个有序的丑数序列,对于每个丑数都分别乘2,3,5这三个基数,取大于当前丑且最小的那个数放入序列。一轮选完后,需要调整每个基数在下一轮乘的丑数,即未被选中的基数的保持原位,选中的向后移动一位。
注意对于边界条件的考虑,这里小于1的情况常规认为不可能发生,但是没有判断即报错。
代码:
1 class Solution { 2 public: 3 int GetUglyNumber_Solution(int index) { 4 if(index<1) 5 return 0; 6 vector<int> uglynumber(index, 0); 7 uglynumber[0] = 1; 8 int ugly2=0, ugly3=0, ugly5=0; 9 int cur_index=1; 10 for(int i=1; i<index; i++) 11 { 12 int cur_ugly = min(uglynumber[ugly2]*2, min(uglynumber[ugly3]*3, uglynumber[ugly5]*5)); 13 uglynumber[cur_index] = cur_ugly; 14 cur_index++; 15 while(cur_ugly >= uglynumber[ugly2]*2) 16 { 17 ugly2++; 18 } 19 while(cur_ugly >= uglynumber[ugly3]*3) 20 { 21 ugly3++; 22 } 23 while(cur_ugly >= uglynumber[ugly5]*5) 24 { 25 ugly5++; 26 } 27 28 } 29 return uglynumber[index-1]; 30 } 31 };