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 }