丑数
思路
1、使用一个数组保存之前的丑数
2、更新下一个丑数的时候只需要比较三个值即可
3、所以,程序的核心就是维护好三个值(对应的下标)
代码
class Solution {
public:
bool isUgly(int x ){
while(x%2==0){
x = x/2;
}
while(x%3==0){
x=x/3;
}
while(x%5==0){
x=x/5;
}
return 1==x;
}
/*
int GetUglyNumber_Solution(int index) {
if(index==1){
return 1;
}
// 最笨的方法
int count=1;
int i = 2;
while(1){
if(isUgly(i)){
count++;
}
if(count==index){
return i;
}
i++;
}
return 0;
}
*/
int GetUglyNumber_Solution(int index){
// 初始化
if(index < 5){
vector<int> ugly_arr ={ 1, 2, 3, 4, 5};
return ugly_arr[index-1];
}
vector<int> ugly_arr(index, 0);
ugly_arr[0] = 1;
ugly_arr[1] = 2;
ugly_arr[2] = 3;
ugly_arr[3] = 4;
ugly_arr[4] = 5;
// 初始化要维护的三个index
int t2_index = 2;
int t3_index = 1;
int t5_index = 1;
int cur_lne = 5;
while(cur_lne < index){
// 获取三个候选值
int M2 = ugly_arr[t2_index]*2;
int M3 = ugly_arr[t3_index]*3;
int M5 = ugly_arr[t5_index]*5;
// 取三个候选值的最小值作为下一个丑数
vector<int> tmp = {M2, M3, M5};
auto min_ugly = *(min_element(tmp.begin(), tmp.end()));
ugly_arr[cur_lne] = min_ugly;
cur_lne++;
// 维护更新三个下标
if(M2 == min_ugly){
t2_index++;
}
if(M3 == min_ugly){
t3_index++;
}
if(M5 == min_ugly){
t5_index++;
}
}
return ugly_arr[--index];
}
};

京公网安备 11010502036488号