leetcode263_264:Ugly Number & Ugly Number II
2015-08-24 19:56
459 查看
Ugly Number
Write a program to check whether a given number is an ugly number.Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.
Note that 1 is typically treated as an ugly number.
解法
判定是否为Ugly Number,一个数如果不出现除2,3,5以外的素数因子,则最终一定归因于1【一直整除2,3,5后的结果】,即Ugly Number=(2^idx2)*(3^idx3)*(5^idx5)【idx2,idx3,idx5>=0】class Solution { public: bool isUgly(int num) { if (num == 1) return true; if (num <= 0) return false; while (num >= 2 && (num % 2 == 0)) num >>= 1; while (num >= 3 && (num % 3 == 0)) num /= 3; while (num >= 5 && (num % 5 == 0)) num /= 5; if (num==1) return true; else return false; } };
Ugly Number II
Write a program to find the n-th ugly number.Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note that 1 is typically treated as an ugly number.
解法
找出第n个Ugly Number,由上述分析知道:Ugly Number=(2^idx2)*(3^idx3)*(5^idx5),所以可以把正整数范围内的所有Ugly Number找到后返回第n个顺序统计量【即第n大的数】。这里主要讲如何找Ugly Number,后面如何线性时间找顺序统计量的问题参考《算法导论》。这里直接对数组排序找到,复杂度O(n*log(n)).
如何找所有Ugly Number,我的思路是先确定idx2,idx3,idx5的最大值:idx2 <= (int)lg(INT_MAX)/lg(2)。根据idx2,idx3,idx5不同取值得到Ugly Number数组。
代码:
//424 ms class Solution { public: int nthUglyNumber(int n) { if (n == 1) return 1; int p[10000]; int len = 0; long long num; for (int i = 0; i <= 13; i++) { for (int j = 0; j <= 20; j++) { for (int k = 0; k <= 30; k++) { num = pow(5, i)*pow(3, j)*pow(2, k); if (num > INT_MAX) break; p[len++] = num; } } } sort(p, p + len); return p[n - 1]; } };
更新
线性时间找顺序统计量下的代码,原理请参考第K顺序统计量的求解原博中第38行代码错误,应该为int i = low + rand() % (high - low +1);
//280ms class Solution { public: int Partition(int A[], int low, int high) { int pivot = A[low]; int i = low; for (int j = low + 1; j <= high; ++j) { if (A[j] <= pivot) { ++i; swap(A[i], A[j]); } } swap(A[i], A[low]); return i; } int Randomized_Partition(int A[], int low, int high) { srand(time(NULL)); int i = low + (rand() % (high - low + 1)); swap(A[low], A[i]); return Partition(A, low, high); } int Randomized_Select(int A[], int p, int q, int i) { if (p == q) return A[p]; int r = Randomized_Partition(A, p, q); int k = r - p + 1; if (i == k) return A[r]; if (i < k) return Randomized_Select(A, p, r - 1, i); else return Randomized_Select(A, r + 1, q, i - k); } int nthUglyNumber(int n) { if (n == 1) return 1; int p[20000]; int len = 0; long long num; int a = 0, b = 0, c = 0; for (int i = 0; i <= 13; i++) { for (int j = 0; j <= 20; j++) { for (int k = 0; k <= 30; k++) { num = pow(5, i)*pow(3, j)*pow(2, k); if (num > INT_MAX) break; p[len++] = num; } } } return Randomized_Select(p,0,len-1,n); } };
相关文章推荐
- java web之Servlet技术
- ARM处理器寄存器
- kvc和kvo的使用情况的了解
- 基数排序C++实现
- Ajax工作原理
- 深入理解PHP原理之错误抑制与内嵌HTML
- uiwebview添加到阅读列表
- 如何让IE支持自定义协议
- 哈诺塔题型问题+uva10795+URAL 2029
- useragent 全集 firefox插件 useragetn switch 使用
- xcode修改代码目录结构出现clang:error:nosuchfileordirectory解决方法
- hibernate3第三章之关联映射
- xcode修改代码目录结构出现clang:error:nosuchfileordirectory解决方法
- 将SALT_STACK的JOB-CACHE放到数据库中,而建库用DJANGO的ORM完成
- 玩转linux第三天之cp,mv ,rm, wc ,cut ,sort,uniq命令详解(三)
- Matlab计算Harr Features源码
- Lowest Bit
- 失业皇帝观后感
- sklearn学习代码
- 最小生成树+Hdu4786