题意理解
丑数是只能被2,3,5整数的数,输出第n个丑数
问题分析
用动规思想
第i个丑数只会和前面的丑数乘以2,3,5的值有关,但我们不会计算每个丑数乘以2,3,4的结果。因为第i个丑数只会和前面一个数乘以2最接近第i-1个数的那个数有关,这个数怎么求,就是拿第i-1个数/2,再计算序列中比这个数稍大的数(upper_bound函数),把这个数×2就可以的出来,同理计算3的倍数,5的倍数,然后得到三者最小值即为当前最小值。
其他
https://leetcode.com/problems/ugly-number-ii/discuss/371323/C%2B%2B-solution-time-94.77-space-100
链接
int nthUglyNumber(int n) {
vector<long long> results;
results=initial(n);
return results[n-1];
}
vector<long long> initial(int n) {
vector<long long> results; //按顺序保存每个丑数
results.push_back(1); //默认放入1
for(int i=1;i<n;++i) { //依次生成
long long a = (*upper_bound(results.begin(), results.end(), results[i-1]/2)) * 2; //找到比当前数大一点的数 2倍
long long b = (*upper_bound(results.begin(), results.end(), results[i-1]/3)) * 3; //找到比当前数大一点的数 3倍
long long c = (*upper_bound(results.begin(), results.end(), results[i-1]/5)) * 5; //找到比当前数大一点的数 5倍
results.push_back(min(min(a, b), c)); //三者最小值为当前的丑数
}
return results;
}