题目描述:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:
- 根据丑数的定义,我们可以知道丑数可以由另外一个丑数乘以2,3或者5得到。因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2,3或者5得到的。
- 我们把当前的丑数(从第一个开始)乘以2,3,5以后得到的结果记为M2,M3和M5。那么当前丑数的后一个丑数应该是M2,M3和M5当中的最小值:Min(M2,M3,M5)。定义三个指针,代表了2,3,5分别指向指向的丑数。
- 移动最小值所在的乘数(2,3,5)的指针。
Demo:
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index <= 6)
return index;
int p2 = 0, p3 = 0, p5 = 0, num = 1;
vector<int> arr;
arr.push_back(num);
while (arr.size() < index)
{
int num = min(2*arr[p2], min(3*arr[p3], 5*arr[p5]));
if (num == 2 * arr[p2]) p2++;
if (num == 3 * arr[p3]) p3++;
if (num == 5 * arr[p5]) p5++;
arr.push_back(num);
}
return arr[index-1];
}
};