题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路
丑数的序列为{1,2,3,4,5,6,8,9,10,12…} 。每个丑数都是前面某一个丑数乘上2/3/5的结果。所以新加入的丑数必然是从原有丑数中与2,3,5乘积中最小的值。
注意:分别设置与2,3,5对应的索引号,该索引对应的数字乘上该因子后的丑数刚好大于目前最大丑数。
每次要加入一个新丑数:
(1)计算索引对应数与因子的乘积
(2)选择乘积最小的,并将对应索引+1
这样计算复杂度为O(n),并且每次只需要计算是丑数的数字;相比对所有整数去判断是否为丑数,减少了计算量。
代码
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index <=0)
return 0;
int index2 = 0; // 该数是乘以2大于目前最大丑数的数中最小的;其序号
int index3 = 0;
int index5 = 0;
vector<int> num = {1}; // 1为最小的丑数
for (int i=1; i< index;i++){
int mul2 = num[index2] * 2; // 与2的乘积
int mul3 = num[index3] * 3;
int mul5 = num[index5] * 5;
int tmp = min(min(mul2,mul3),mul5); // 找到乘积中最小的数加入数组
if (tmp==mul2) ++index2; // 并将其序号+1
if (tmp== mul3) ++index3;
if (tmp==mul5) ++index5;
num.push_back(tmp);
}
return num[index-1];
}
};