设计一个算法,找出只含素因子2
,3
,5
的第 n 大的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
看到题的第一个想法一直向下枚举 直到找到第N个数
我的思路是 :每一个丑数都是由一个丑数乘2乘3乘5得来的,可以把第一个丑数也就是1放进优先队列中,然后进行N次操作每次取出队头然后把队头
的二倍,三倍,五倍入队,注意的是队列中可能会有重复的数所以要判断是不是重复的数
codelint提交代码如下
class Solution {
public:
/*
* @param n an integer
* @return the nth prime number as description.
*/
int nthUglyNumber(int n) {
// write your code here
priority_queue<long long,vector<long long >,greater<long long > > s;
s.push(1);
long long last = 0;
long long t=0;
n--;
while(n--)
{
t = s.top();
while(t == last)
{
t = s.top();
s.pop();
}
last = t;
s.push(t*2);
s.push(t*5);
s.push(t*3);
}
while(t == last)
{
t = s.top();
s.pop();
}
return t;
}
};
C++调试代码如下
#include <iostream>
#include <functional>
#include <queue>
using namespace std;
int main()
{
priority_queue<long long,vector<long long >,greater<long long > > s;
s.push(1);
long long last = 0;
int n;
cin>>n;
long long t=0;
n--;
while(n--)
{
t = s.top();
while(t == last)
{
t = s.top();
s.pop();
}
last = t;
s.push(t*2);
s.push(t*5);
s.push(t*3);
}
while(t == last)
{
t = s.top();
s.pop();
}
cout<<t<<endl;
return 0;
}