丑数

题目

  把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

分析

  如何对每个数字进行丑数的判断,时间复杂度将会非常大,所以我们要从其他角度进行考虑。

  使用ArrayList<Integer> list去存储丑数,当list.size()小于index时,从list的第一个元素开始乘以2,直到所得结果大于list中的最后一个元素,即为x;从list的第一个元素开始乘以3,直到所得结果大于list中的最后一个元素,即为y;从list的第一个元素开始乘以5,直到所得结果大于list中的最后一个元素,即为z。然后找出x、y、z中最小的元素加入list中。

代码

 1     public int min(int x, int y, int z){
 2         int temp = (x<y)? x:y;
 3         return (temp<z)? temp:z;
 4     }
 5     
 6     public int GetUglyNumber_Solution(int index){
 7         if(index==0)
 8             return 0;
 9         ArrayList<Integer> list = new ArrayList<Integer>();
10         list.add(1);
11         int a = 2, b = 3, c = 5;
12         int x = 0, y = 0, z = 0;
13         while(list.size() != index){
14             int temp = list.get(list.size()-1);
15             int i = 0, j = 0, k =0;
16             while(temp>=list.get(i)*a){
17                 i++;
18             }
19             x = list.get(i)*a;
20             while(temp>=list.get(j)*b){
21                 j++;
22             }
23             y = list.get(j)*b;
24             while(temp>=list.get(k)*c){
25                 k++;
26             }
27             z = list.get(k)*c;
28             list.add(min(x, y, z));
29         }
30         return list.get(list.size()-1);
31     }
原文地址:https://www.cnblogs.com/jiqianqian/p/6950944.html