剑指 Offer 49. 丑数
剑指 Offer 49. 丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
是前 10 个丑数。
说明:
1
是丑数。n
不超过1690。
解析:
2的次方,3的次方,5的次方,组合即可
然后放到set里,再遍历
很少,不会超时,只需要注意越界即可
class Solution { public: set<long long> ss; int nthUglyNumber(int n) { vector<long long> nums[3]; const unsigned long long maxn = 2147483647; long long a = 1, b = 1, c = 1; nums[0].push_back(1); nums[1].push_back(1); nums[2].push_back(1); for(int i = 1; i < 31; i++) { if(a * 2 <= maxn) { a *= 2; nums[0].push_back(a); } if(b * 3 <= maxn) { b *= 3; nums[1].push_back(b); } if(c * 5 <= maxn) { c *= 5; nums[2].push_back(c); } } for(int i = 0; i < nums[0].size(); i++) { long long a = nums[0][i]; for(int j = 0; j < nums[1].size(); j++) { long long b = nums[1][j]; for(int k = 0; k < nums[2].size(); k++) { long long c = nums[2][k]; if((unsigned long long)(a * b) <= maxn && (unsigned long long)(a * c) <= maxn && (unsigned long long)(b * c) <= maxn && (unsigned long long)(a * b * c) <= maxn) { ss.insert(a * b * c); } } } } ss.insert(1); int m = 0; long long ret; for(set<long long>::iterator it = ss.begin(); it != ss.end(); it++) { m++; if(m == n) { ret = *it; break; } } return ret; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。