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>
Note that
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
<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
1is 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
相关文章推荐
- va_start和va_end使用详解
- PCL 下载地址
- 「UnityShader」学习笔记:0、内容描述
- Codeforces Round #361 (Div. 2) C
- 各种音频编码方式的对比
- 数值运算符
- 提高项目30.6-删除字符串前面的空格
- wins和ubuntu系统上搭建个人博客环境(wordpress)
- 自定义组件一
- 手机流媒体技术概要
- mongodb 在单机上搭建分片集群 详细实战过程
- Spring
- 最长上升子序列
- python在提示符下使用open打开文件失败原因
- Flume
- 为手机多媒体设备图像显示选择合适的协议
- PCB设计中数字地、模拟地、数字电源、模拟电源的处理方式
- 逻辑回归(Logistic Regression)
- yum源配置
- 基于水平投影,垂直投影的字符图像分割思路和代码实现