• LeetCode -- Ugly Number II


    Question:

    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.

    Analysis:

    问题描述:写一个程序判断第n个丑数是多少。

    思路一:由于前面求过了如何判断一个数是否为丑数,那么可以一次判断每个数是否为丑数,若是丑数,计数器+1,知道计数器==n,时间复杂度较高,Time Limited%>_<%

    思路二:又是DP问题。。。还是找不到思路呢。看了网上的解答,由于每个丑数总是有2、3、5相乘构成的。因此用3个list维护已经求出的丑数,然后每次在里面加入当前丑数*2、*3、*5,每次从3个list中取最小的一个作为第i个丑数;

    list1 = {1,1*2,2*2,3*2,4*2,5*2,6*2,8*2,……}

    list2 = {1,1*3,2*3,3*3,4*3,5*3,6*3,8*3,……}

    list3 = {1,1*5,2*5,3*5,4*5,5*5,6*5,8*5,……}

    Answer:

    思路1:

    public class Solution {
       public static int nthUglyNumber(int n) {
                int k = 1;
                int res = 1;
            while(true) {
                    if(k == n)
                        return res;
                    res++;
                    if(isUgly(res)) {
                        k++;
                    }
            }
        }
        
        
        
        public static boolean isUgly(int num) {
            if(num <= 0)
                    return false;
            while(num != 0 && (num%2==0 || num%3==0 || num%5==0)) {
                    if(num % 2 == 0)
                        num = num / 2;
                    if(num % 3 == 0)
                        num = num / 3;
                    if(num % 5 == 0)
                        num = num / 5;
            }
            if(num == 1)
                    return true;
            else
                    return false;
        }
        
        
    }

    思路2:

    public class Solution {
      public static int nthUglyNumber(int n) {
                int res = 0;
                List<Integer> l1 = new ArrayList<Integer>();
                List<Integer> l2 = new ArrayList<Integer>();
                List<Integer> l3 = new ArrayList<Integer>();
                
                l1.add(1);
                l2.add(1);
                l3.add(1);
                
                for(int i=0; i<n; i++) {
                    res = Math.min(Math.min(l1.get(0), l2.get(0)), l3.get(0));
                    
                    if(res == l1.get(0)) l1.remove(0);
                    if(res == l2.get(0)) l2.remove(0);
                    if(res == l3.get(0)) l3.remove(0);
                    
                    l1.add(res * 2);
                    l2.add(res * 3);
                    l3.add(res * 5);
                    
                }
                return res;
        }
        
    }
  • 相关阅读:
    HDU 3033 I love sneakers!
    HDU 1712 ACboy needs your help
    FZU 1608 Huge Mission
    HDU 3394 Railway
    【MySQL】20个经典面试题,全部答对月薪10k+
    mysql故障解决笔记
    mysql 索引类型
    linux禁用锁定和解除解锁用户账号的方法
    Linux服务器制定mysql数据库备份的计划任务
    网站服务器安全防范小知识
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/4822124.html
Copyright © 2020-2023  润新知