当前位置:首页 > 未命名 > 正文内容

【解题报告】lintcode4求第n个丑数

u3blog9年前 (2016-05-16)未命名551

题意

设计一个算法,找出只含素因子2,3,5 的第 n 大的数。 符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...

解答

既然只有素数因子2,3,5,那么我们可以得知,第n个丑数肯定是前面某一个丑数乘以2,3,5的结果 那么,我们可以以此生成一个丑数表 但是,第n个丑数是多少呢,可以得知,是比前一个数大的最小丑数 我们设置三个计数器,记录乘2,3,5比当前最大的丑数还要大的下标 每次添加就从这三个下标的数乘2,3,5的结果中选最小的一个 如此循环,得到第n个

代码

  1. class Solution {
  2. /**
  3. * @param n an integer
  4. * @return the nth prime number as description.
  5. */
  6. List<Integer> uglyList = new ArrayList<Integer>(){{this.add(1);this.add(2);this.add(3);this.add(4);this.add(5);this.add(6);}};
  7. public int nthUglyNumber(int n) {
  8. // Write your code here
  9. int p2 = 0,p3 = 0,p5 = 0,max = uglyList.get(uglyList.size() - 1);
  10. if (n <= uglyList.size())
  11. return uglyList.get(n-1);
  12. while (uglyList.size() < n) {
  13. while (uglyList.get(p2) * 2 <= max)
  14. p2++;
  15. while (uglyList.get(p3) * 3 <= max)
  16. p3++;
  17. while (uglyList.get(p5) * 5 <= max)
  18. p5++;
  19. int next = min(uglyList.get(p2) * 2, uglyList.get(p3) * 3, uglyList.get(p5) * 5);
  20. max = next;
  21. uglyList.add(next);
  22. }
  23. return max;
  24. }
  25. private int min(int a,int b,int c){
  26. int x = Math.min(a,b);
  27. int y = Math.min(x,c);
  28. return y;
  29. }
  30. };

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=406

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。