题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解法:1.前一个丑数都乘以2.3.5,取其中最小的值为下一个丑数
2.由于要维持3个数组的值,所以这里需要用到3个下标值,这样才能记录下需要乘的前一个丑数的位置,以及下一个位置
3.例如,235取2为下一个丑数,维持乘2的下标变化,但是维持3和5的都没有变化,从最先的那个丑数开始
4.原始的方法是每个数字循环,不断取余数,除2或3或5循环。改进的方法思想比较好。
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index <= 0) return 0;
vector<int> result;
int i = 0, j = 0, k = 0;
int nextIndex = 1;
int nextUglyNumber;
result.push_back(1);
while(nextIndex < index) {
nextUglyNumber = min(result[i]*2, result[j]*3, result[k]*5);
result.push_back(nextUglyNumber);
while(result[i]*2 <= nextUglyNumber) i++;
while(result[j]*3 <= nextUglyNumber) j++;
while(result[k]*5 <= nextUglyNumber) k++;
nextIndex++;
}
return result[nextIndex-1];
}
int min(int i, int j, int k) {
int min;
min = (i < j) ? i:j;
min = (min < k) ? min:k;
return min;
}
};