[刷题]Ugly Number
2016-03-10 15:13
281 查看
[LintCode]Ugly Number
Version 1 Memory Limit Exceeded 失败class Solution { /** * @param k: The number k. * @return: The kth prime number as description. */ public long kthPrimeNumber(int k) { // Memory Limit Exceeded ArrayList<Boolean> list = new ArrayList<Boolean>(); list.add(false); // 0 list.add(true); // 1 list.add(false); // 2 list.add(true); // 3 list.add(false); // 4 list.add(true); // 5 list.add(false); // 6 list.add(true); // 7 // 从8开始一个一个的找,下一个ugly number是第4个 int index = 3; int num = 8; while (true) { if (num % 3 == 0 && list.get(num / 3)) { list.add(true); index++; } else if (num % 5 == 0 && list.get(num / 5)) { list.add(true); index++; } else if (num % 7 == 0 && list.get(num / 7)) { list.add(true); index++; } else { list.add(false); } if (index == k) { return num; } num++; } } };
Version 2 Time Limit Exceeded 失败
class Solution { /** * @param k: The number k. * @return: The kth prime number as description. */ public long kthPrimeNumber(int k) { // Time Limit Exceeded HashSet<Integer> set = new HashSet<>(); set.add(3); set.add(5); set.add(7); // 从8开始一个一个的找,下一个ugly number是第4个 int index = 3; int num = 8; while (true) { if (num % 3 == 0 && set.contains(num / 3)) { set.add(num); index++; } else if (num % 5 == 0 && set.contains(num / 5)) { set.add(num); index++; } else if (num % 7 == 0 && set.contains(num / 7)) { set.add(num); index++; } if (index == k) { return num; } num++; } } };
Version 3 Accepted
class Solution { /** * @param k: The number k. * @return: The kth prime number as description. */ public long kthPrimeNumber(int k) { // 2016-03-14 不会计算时间复杂度 if (k <= 0) { return 0; } long[] factors = {(long)3, (long)5, (long)7}; HashSet<Long> set = new HashSet<>(); // 防止反复插入同一个数 PriorityQueue<Long> queue = new PriorityQueue<>(); for (int i = 0; i < 3; i++) { set.add(factors[i]); queue.add(factors[i]); } // 循环k次,每次取出一个最小的ugly number // queue中元素个数越来越多,效率越来越低 long minNum = 0; long newNum = 0; for (int i = 0; i < k; i++) { minNum = queue.poll(); // 取出最小的ugly number for (int j = 0; j < 3; j++) { newNum = minNum * factors[j]; if (!set.contains(newNum)) { set.add(newNum); queue.add(newNum); } } } return minNum; } };
相关文章推荐
- Qt5双缓冲机制
- HDOJ 5093 Battle ships 二分图匹配
- linux 安装SVN
- SQL Cookbook
- (转)Shell函数
- Exchange2007升级到Exchange2013(6)——迁移邮箱测试
- Shell最多可以输入多少个参数?
- 一键准备Oracle安装
- 序列sequence中的cache问题
- Oracle常用函数汇总
- 闭包的深刻理解,解释很详细
- Oracle工具之DBNEWID
- Linux命令之diff
- SQL*Loader之CASE11
- SQL*Loader之CASE10
- SQL*Loader之CASE9
- SpringMVC中model的三种返回形式
- SQL*Loader之CASE8
- SQL*Loader之CASE7
- SQL*Loader之CASE6