<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