您的位置:首页 > 其它

264. Ugly Number II

2016-07-11 21:54 239 查看
<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: