思路
和”面试题 17.09. 第 k 个数 最小堆或者是三指针“一样。
代码
class Solution {
public:
// int nthUglyNumber(int n) {
// // 指示所有乘以2,3,5得到的数字
// int k1=0,k2=0,k3=0;
// vector<int>vs(n+1);
// vs[0]=1;
// int minn=1;
// for(int i=1;i<n;i++){
// minn=vs[i]=min(min(vs[k1]*2,vs[k2]*3),vs[k3]*5);
// // cout<<minn<<endl;
// if(minn==vs[k1]*2){
// k1++;// 取下一个数字
// }
// if(minn==vs[k2]*3){
// k2++;// 取下一个数字
// }
// if(minn==vs[k3]*5){
// k3++;// 取下一个数字
// }
// }
// return minn;
// }
typedef long long ll;
int nthUglyNumber(int n) {
// 指示所有乘以2,3,5得到的数字
priority_queue<ll,vector<ll>,greater<ll> >q;
q.push(1);
ll res=1;
ll cnt=1;
while(cnt<n){
cnt++;
res=q.top();
q.pop();
while(!q.empty()&&res==q.top()){
q.pop();
}
q.push(res*2);
q.push(res*3);
q.push(res*5);
}
res=q.top();
return (int)res;
}
};