丑数

题目链接

思路1

  1. 写判定丑数的函数
  2. 循环直至找到第K个丑数
    我知道这道题的意思不是这个意思,果然超时了。时间爱你复杂度是O(n*logn)

思路2

看书才发现空间换时间这个办法
1.开一个K长度的数组
2.存储j个求过的丑数,并保证有序
3.当求新的丑数时 从T2,T3,T5位置开始扫描,找到第一个大于最后一个丑数M得到M2,M3,M5选择其中最小的作为新的丑数
4.重复计算直至找到第K个丑数

public class Solution {
    public int GetUglyNumber_Solution(int index) {
         if(index<=0){
              return 0;
          }
          int[] ugly = new int[index];//存储·所有的丑数

          int T2 =0;
          int M2 =0;
          int T3 = 0,M3 = 0;
          int T5 = 0,M5 = 0;;
          ugly[0]  =1;
          int M = 1;//记录最后一个丑数
          for(int i=1;i<index;i++){
              for(;T2<i;T2++){
                  M2 = ugly[T2]*2;
                  if(M2>M){
                      break;
                  }
              }
              for(;T3<i;T3++){
                  M3 = ugly[T3]*3;
                  if(M3>M){
                      break;
                  }
              }
              for(;T5<i;T5++){
                  M5 = ugly[T5]*5;
                  if(M5>M){
                      break;
                  }
              }
              ugly[i] = Math.min(M2, Math.min(M3, M5));
              M = ugly[i];
          }
          return ugly[index-1];
    }
}

你可能感兴趣的:(丑数)