题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
丑数只能被2,3,5整除,所以我们一直除以2,一直除以3,一直除以5 ,如果最后等于1就是丑数
解法1:暴力 超时了 最后。
1 public class Solution { 2 public int GetUglyNumber_Solution(int index) { 3 int ug_cnt=0; 4 int num =1; 5 while(ug_cnt<index){ 6 if(isUgly(num)) ug_cnt++; 7 num++; 8 } 9 return num; 10 } 11 private boolean isUgly(int num){ 12 while(num %2== 0 ) 13 num/=2; 14 while(num %3 == 0 )num/=3; 15 while(num %5== 0 ) 16 num/=5; 17 return num==1; 18 } 19 }
解法2:
把前面已经是丑数的数保存起来。
创建一个数组,数组里面的丑数是排好序的,每一个丑数都是前面的丑数乘以2,3,5得到的。
对于乘以2,肯定存在某个丑数T2,排在它之前的每一个丑数乘以2得到的结果都会小于已有的最大的丑数,
排在T2之后的都太大。
语法问题:
int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标
int t2,t3,t5 =0;//错误
Java不会默认的初始化为0
1 import java.util.ArrayList; 2 import java.lang.Math; 3 public class Solution { 4 public int GetUglyNumber_Solution(int n) { 5 if(n<=0) return 0; 6 ArrayList<Integer> list = new ArrayList<Integer>(); 7 list.add(1); 8 int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标 9 while(list.size()<n){ 10 int min = Math.min(list.get(t2)*2,Math.min(list.get(t3)*3,list.get(t5)*5)); 11 list.add(min); 12 if(min==list.get(t2)*2) t2++; 13 if(min==list.get(t3)*3) t3++; 14 if(min==list.get(t5)*5) t5++; 15 } 16 return list.get(list.size()-1); 17 } 18 }
c++; 20180725
1 class Solution { 2 public: 3 int GetUglyNumber_Solution(int index) { 4 if(index<1) return 0; 5 vector<int> res(index); 6 int t2=0,t3=0,t5=0; 7 res[0] = 1; 8 for(int i =1;i <index;i++){ 9 int m = min(res[t2]*2,min(res[t3]*3,res[t5]*5)); 10 res[i] = m; 11 if(m==res[t2]*2) t2++; 12 if(m==res[t3]*3) t3++; 13 if(m==res[t5]*5) t5++; 14 } 15 return res[index-1]; 16 } 17 };