数学模拟题,
只包含质因子2、3和5的数称作丑数,所以丑数的形式实质上是:2x3y5z。
对于x、y、z的理解,把他们视作三个独立维护的指针,可以想象有三个队列:
队列2: 1×2 → 2×2 → 3×2 → 4×2 → ...
队列3: 1×3 → 2×3 → 3×3 → 4×3 → ...
队列5: 1×5 → 2×5 → 3×5 → 4×5 → ...
每次取三个队首的最小值,并移动对应指针。res就是要比这对求出这三个队列中的最小值。
int GetUglyNumber_Solution(int index) {
if(index == 0) return 0;
// write code here
// res 用以维护得到的丑数序列
vector<long long> res(index);
res[0] = 1;
// 丑数实质是2^x * 3^y * 5^z
// x y z 用以标记2,3,5乘的次数
int x = 0,y = 0, z = 0;
for(int i = 1; i < index; i++){
// 因为每个res都是一个丑数,求出下一个res肯定是由先前的丑数*2/*3/*5出来的,所以维护三个不同的指针,指向先前不同的丑数,当前的丑数就是这三个中最小的。
res[i] = min(res[x]*2, min(res[y]*3, res[z]*5));
if(res[i] == res[x]*2) x++;
if(res[i] == res[y]*3) y++;
if(res[i] == res[z]*5) z++;
}
return res[index - 1];
}