判斷這個數是否是醜數
解題思路
題目中的醜數是隻包含質因數2,3,5
的正整數,也就是說如果一個數是醜數的話那麼這個數一定只包含因數2,3,5
,因此我們可以將這個數依次除去2,3,5
最後判斷這個數是否是被除盡,如果除盡的話那麼這個數就是醜數,返回true
,否則返回false
bool isUgly(int num) {
if(num < 1) return false;
while(num % 2 == 0) num /= 2;
while(num % 3 == 0) num /= 3;
while(num % 5 == 0) num /= 5;
return num == 1;
}
求第K個醜數
題目描述
思路
定義三個指針idx3
,idx5
,idx7
,idx3
指向的數字永遠乘3
,idx5
指向的數字永遠乘5
,idx7
指向的數字永遠乘7
初始化所有指針都指向第一個醜數,即1
我們從dp[idx3]*3
,dp[idx5]*5
,dp[idx7]*7
選取最小的一個數字,作爲新的醜數。這邊新的醜數就是3*dp[idx3]=3*1=3
,然後idx3++
此時idx5
和idx7
指向第1個醜數,idx3
指向第2
個醜數。然後重複上一步
這裏基於的一個事實是,醜數數列是遞增的,當idx5
指針在當前位置時,後面的數乘以5
必然比前面的數乘以5
大,所以下一個醜數必然是先考慮前面的數乘以5
。idx3
,idx7
同理,所以纔可以使用指針
int getKthMagicNumber(int k) {
int idx3 = 0, idx5 =0, idx7 = 0;
vector<int> dp(k+1, 1);
for(int i = 1; i <= k; i++)
{
dp[i] = min(min(3 * dp[idx3], 5 * dp[idx5]), 7 * dp[idx7]);
dp[i] == 3 * dp[idx3] ? idx3++ : idx3;
dp[i] == 5 * dp[idx5] ? idx5++ : idx5;
dp[i] == 7 * dp[idx7] ? idx7++ : idx7;
}
return dp[k-1];
}