题目:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
1. 从1开始向后判断每个数是不是丑数,如果是则计数加1,直到找到要求的第index个数,这样需要遍历很多对题目没用的非丑数
2.从1开始,乘2或3或5,将其中最小的数放到下一个丑数的位置,直到得到要求的第index个丑数,需要使用一个辅助数组来存储生成的丑数
代码实现:
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index <= 0)
return 0;
int *result = new int[index];
result[0] = 1;
int next_idx = 1;
int *mult2 = result; //分别使用三个指针来实现对现有丑数的乘2,3,5的操作
int *mult3 = result;
int *mult5 = result;
while(next_idx < index)
{
int min_ugly = minUgly(*mult2 * 2, *mult3 * 3, *mult5 * 5); //保证从小到大的顺序
result[next_idx] = min_ugly;
while(*mult2 * 2 <= result[next_idx]) //如果新加的元素是已有的丑数乘2得到的,就将乘2的指针向后挪一位
mult2++;
while(*mult3 * 3 <= result[next_idx])
mult3++;
while(*mult5 * 5 <= result[next_idx])
mult5++;
next_idx++;
}
int ugly_result = result[index - 1];
delete[] result;
return ugly_result;
}
int minUgly(int num1, int num2, int num3)
{
int min = num1 > num2 ? num2 : num1;
min = min > num3 ? num3 : min;
return min;
}
};