Re: [閒聊] 每日leetcode

作者: enmeitiryous (enmeitiryous)   2024-08-18 17:48:24
終於考完試了
題目:
264. Ugly Number II:
ugly number的定義是只由2、3、5三種質因數的數字,給定一個數字n,回傳第
n個由小到大的ugly number,例:給定n=6,ugly number由小到大依序為1,2,3,4,5,6
所以回傳的數為6
思路:
保持三個固定要被*2, *3, *5的三個min heap,每次比較這三個heap的top乘完對應數後
誰最小,並將最小的乘結果更新為ans,把被乘數從該heap pop出再將anspush進三個
heap,做n次得到的即為解,要注意如果有任兩個heap頂部相乘結果相同只能擇一使用
後將另一個被乘數pop出來,正解應該是用三個變數對應三種乘數只針對同一個vector
更新
int nthUglyNumber(int n) {
if(n==1){
return 1;
}
priority_queue <int, vector<int>, greater<int>> m2;
priority_queue <int, vector<int>, greater<int>> m3;
priority_queue <int, vector<int>, greater<int>> m5;
m2.push(1);
m3.push(1);
m5.push(1);
int ans=1;
int cnt=1;
int reg=0;
while(cnt!=n){
if(m2.top()*2<m3.top()*3){
ans=m2.top()*2;
reg=2;
}
else if(m2.top()*2>m3.top()*3){
ans=m3.top()*3;
reg=3;
}
else{
ans=m2.top()*2;
reg=2;
m3.pop();
}
if(ans>m5.top()*5){
ans=m5.top()*5;
reg=5;
}
else if(ans==m5.top()*5){
m5.pop();
}
///
cnt++;
if(cnt==n){
return ans;
}
if(reg==2){
m2.pop();
}
else if(reg==3){
m3.pop();
}
else if(reg==5){
m5.pop();
}
m2.push(ans);
m3.push(ans);
m5.push(ans);
}
return ans;
}
作者: Smallsh (Smallsh)   2024-08-18 17:49:00
大師

Links booklink

Contact Us: admin [ a t ] ucptt.com