解题思路:动态规划。使用 i
, j
, k
三个指针,分别记录当前数*2,*3,*5的值,初始时指向第一个丑数,依次将array[0] * 2, array[j]*3,array[k]*5 ,取最小值,则为下一个丑数,然后比较是i, j, k哪个数的倍数,则将索引后移即可。
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index <= 1) return index;
vector<int> ugly = {1};
int i = 0, j = 0, k = 0;
for (int p = 1; p < index; p++){
int next = minThree(ugly[i]*2, ugly[j]*3, ugly[k]*5);
if (next == ugly[i] * 2) i++;
if (next == ugly[j] * 3) j++;
if (next == ugly[k] * 5) k++;
ugly.push_back(next);
}
return ugly[index-1];
}
private:
int minThree(int x, int y, int z){
return min(x, min(y, z));
}
};
执行结果