判断这个数是否是丑数
解题思路
题目中的丑数是只包含质因数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];
}