丑数
- 参与人数: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]; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-06 10:01:36