丑数
- 参与人数:1051时间限制:1秒空间限制:32768K
- 通过比例:19.37%
- 最佳记录:0 ms|0K(来自 shi_kai)
题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。
求按从小到大的顺序的第N个丑数。
方法一,我们可以通过判断一个数是否是丑数(因子连除)得到结果,返回第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;
}
};
当然我本来想用静态数组保存下来的;测了下2000就够了,因为int再大就超了,
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];
}
};