1 /*思路:为了提高实践效率,不对每一个数都判断它是不是丑数直至找到第N个丑数
2 用实践换空间,创建一个数组对已有的丑数进行排序,下一个丑数是由前面的丑数乘2,乘3或乘5得到的
3 分别找到第一个大于当前最大丑数的数,比较三者的最小值,最小值则为我们要找的下一个丑数
4 注意:不是每次都从数组的第一个元素开始*2 *3 *5 我们要分别记录三个索引值,这三个索引值所对应的m2,m3,m5
5 刚好大于上一个元素 这样就不用把前面所有的丑数都乘2,乘3.乘5
6 */
7
8
9 public class Solution {
10 //记录丑数数组中分别要乘2,乘3,乘5,然后和当前最大丑数进行比较的起始位置
11 int index2=0;
12 int index3=0;
13 int index5=0;
14 public int GetUglyNumber_Solution(int index) {
15 if(index<1) return 0;
16 int[] uglyNumbers=new int[index];
17 uglyNumbers[0]=1;
18 int nextUglyNumberIndex=1;
19 while(nextUglyNumberIndex<index){
20 int nextUglyNumber=Min(uglyNumbers,nextUglyNumberIndex-1);
21 uglyNumbers[nextUglyNumberIndex]=nextUglyNumber;
22 nextUglyNumberIndex++;
23 }
24 return uglyNumbers[index-1];
25 }
26 public int Min(int[] arr,int index){
27 int m2=0;
28 int m3=0;
29 int m5=0;
30 int len=arr.length;
31 for (int i=index2;i<len;i++){
32 if (arr[i]*2>arr[index]){
33 m2=arr[i]*2;
34 //记录下一次已有丑数*2的起始下标
35 index2=i;
36 break;
37 }
38 }
39 for (int i=index3;i<len;i++){
40 if (arr[i]*3>arr[index]){
41 m3=arr[i]*3;
42 //记录下一次已有丑数*2的起始下标
43 index3=i;
44 break;
45 }
46 }
47 for (int i=index5;i<len;i++){
48 if (arr[i]*5>arr[index]){
49 m5=arr[i]*5;
50 //记录下一次已有丑数*2的起始下标
51 index5=i;
52 break;
53 }
54 }
55 if (m2<=m3&&m2<=m5){
56 return m2;
57 }else if (m3<=m2&&m3<=m5){
58 return m3;
59 }else {
60 return m5;
61 }
62 }
63 }