剑指offer_UglyNummber

 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 }

 

posted @ 2018-02-12 11:10  大熊好好写代码  阅读(244)  评论(0编辑  收藏  举报