33 丑数

题目描述

把只包含因子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 };
原文地址:https://www.cnblogs.com/zle1992/p/8157989.html