题目描述
丑数,这题可以理解为求取只包含2,3,5质数因为的数的从小到大的集合,可以考虑为一个三路归并的问题,第一路是包含质因子2的所有数的集合,第二路是包含3的质因子的所有数的集合,同理,第三路是包含5的质因子的所有数的集合,但是可以看出,这三路是有交集的,所以需要去重,还有就是需要指出的是此为只包含2,3,5质因子的集合。就yxcls所说的题解来看,可以看出每一路的元素其实都在归并后的数组中,且这个数组可以保证其中的每个元素都是只包含2,3,5质因子。
正确算法1
C++ 代码
class Solution {
public:
int getUglyNumber(int n) {
if(n <= 1) return n;
vector<int> f(1,1);
int i = 0, j = 0, k = 0;
long long t = 0;
while(--n)
{
t = min(f[i] * 2, min (f[j] * 3, f[k] * 5));
if(t == f[i] * 2) i++;
if(t == f[j] * 3) j++;
if(t == f[k] * 5) k++;
f.push_back(t);
}
return f.back();
}
};
错误C++ 代码
class Solution {
public:
int getUglyNumber(int n) {
if(n <= 1) return n;
int i = 1;
int j = 1;
int k = 1;
long long res = 0;
while(--n)
{
res = min(i * 2, min (j * 3, k * 5));
// cout << res << endl;
if(res >= i * 2) i++;
if(res >= j * 3) j++;
if(res >= k * 5) k++;
//cout << res << endl;
}
return res;
}
};
好家伙错误代码和我一模一样
函数最后返回的是
f.back()
,可不可以是f[n - 1]
,不太理解,求佬解答一哈while()
中n
的值改变了,所以存在了越界的情况#include[HTML_REMOVED]
using namespace std;
int n;
int k=0;
bool ugly(int x)
{
bool b=1;
int i=2;
while(x>1&&b==1)
{
if(x%i==0)
{
x=x/i;
if(i!=2&&i!=3&&i!=5)b=0;
}
else
i;
}
return b;
}
int main()
{
cin>>n;
int i=1;
while(k<n)
{
i;
if(ugly(i)==1)k++;
}
cout<<i;
return 0;
}
vector[HTML_REMOVED] f(1,1);什么意思
指的是建一个 vector f = {1}
vector<int> f(a, b);
相当于 f={b, b, b … b} (a个b)