方法一,我们可以通过判断一个数是否是丑数(因子连除)得到结果,返回第index个丑数,时间效率不高,但是没有额外的空间消耗;
方法二:我们把所有的丑数存起来,因为丑数必然是2,3,5的倍数,每次加入最小的x=min(*ugly2*2,min(*ugly3*3,*ugly5*5)); 三个指针用来指向数组内的值,并更新!
class Solution
{
public:
int GetUglyNumber_Solution(int n)
{
if(n<=0) return 0;
int *arr = new int[n];
arr[0] = 1;
int *ugly2 = arr;
int *ugly3 = arr;
int *ugly5 = arr;
int cnt = 1;
while(cnt<n)
{
int x = min(*ugly2*2,min(*ugly3*3,*ugly5*5));
arr[cnt] = x;
while(*ugly2*2<=arr[cnt])
++ugly2;
while(*ugly3*3<=arr[cnt])
++ugly3;
while(*ugly5*5<=arr[cnt])
++ugly5;
++cnt;
}
int ans = arr[cnt-1];
delete []arr;
return ans;
}
};class Solution {
public:
int arr[2005];
int GetUglyNumber_Solution(int index) {
if(index<=0) return 0;
static int it2(0),it3(0),it5(0),it(0);
if(index<=it) return arr[index-1];
arr[0]=1;
while(1)
{
long long x=min((long long)arr[it2]*2,min((long long )arr[it3]*3,(long long)arr[it5]*5));
if(x>=0x6fffffff||it>2000) break;
arr[++it]=(int)x;
while(arr[it2]*2<=arr[it]) it2++;
while(arr[it3]*3<=arr[it]) it3++;
while(arr[it5]*5<=arr[it]) it5++;
}
return arr[index-1];
}
};最后我想说,本来我想用动态数组vector的,可是没成功,下标越界,我也不知怎么改才好。
关于这个段错误,有人帮我看下吗?
回复我!
class Solution {
public:
vector<int> arr;
int GetUglyNumber_Solution(int index) {
if(index<=0) return 0;
if(index<arr.size()) return arr[index-1];
if(arr.empty())arr.push_back(1);
static int it2(0),it3(0),it5(0),it(0);
for(;arr.size()<=index;)
{
// printf("%d\t%d\t%d\n",arr[it2]*2,arr[it3]*3,arr[it5]*5);
long long x=min(arr[it2]*2,min(arr[it3]*3,arr[it5]*5));
if(x>=INT_MAX) break;
arr.push_back((int)x);
it++;
while(arr[it2]*2<=arr[it]) it2++;
while(arr[it3]*3<=arr[it]) it3++;
while(arr[it5]*5<=arr[it]) it5++;
}
if(arr.size()<index-1) return 0;
else return arr[index-1];
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u010579068/article/details/48805883