醜數
只包含質因數 2, 3, 5 的正整數。
循環除以5,3,2這些因子,看最後結果是否爲1。
class Solution {
public:
bool isUgly(int num) {
if(num<1) return false;
while(num%5==0)
num=num/5;
while(num%3==0)
num=num/3;
while(num%2==0)
num=num/2;
return num==1;
}
};
264 醜數Ⅱ
三指針
dp[i]表示第i個醜數(從0開始計數)
因爲醜數肯定是一個醜數乘以2,3,5這些因子得到的,關鍵點在於怎麼保證計算出的順序是滿足從小到大的。
使用三指針 p1,p2,p3指向需要倍乘的醜數,保證每一個數醜數都得到倍乘的機會。
如果乘積已經被錄取了,就下一個醜數與這個指針代表的倍數相乘。
如果發生了2*3=3*2則兩個指針都需要up,因此使用if,而非else if.
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n,1);
int p1=0,p2=0,p3=0;
for(int i=1;i<n;i++)
{
dp[i]=min(dp[p1]*2,min(dp[p2]*3,dp[p3]*5));
if(dp[i]==dp[p1]*2)
p1++;
if(dp[i]==dp[p2]*3)
p2++;
if(dp[i]==dp[p3]*5)
p3++;
}
return dp[n-1];
}
};