264. Ugly Number II

<span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Write a program to find the </span><code style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255);">n</code><span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">-th ugly number.</span>
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">
</span>
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Ugly numbers are positive numbers whose prime factors only include </span><code style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255);">2, 3, 5</code><span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">. For example, </span><code style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255);">1, 2, 3, 4, 5, 6, 8, 9, 10, 12</code><span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> is the sequence of the first </span><code style="margin: 0px; padding: 0px; background-color: rgb(255, 255, 255);">10</code><span style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> ugly numbers.</span>

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:


三个list已经包含了所有的ugly number,依次取最小值

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;
    }
    
}

参考:http://www.cnblogs.com/little-YTMM/p/4822124.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值