題目描述,輸入一個N,輸出第N個醜數。 醜數的意思是質因子是2,3,5的數,規定1是第一個醜數。
思路:既然質因子是2,3,5, 那麼一個醜數肯定就隻能是2^a*3^b*5^c 的數,a,b,c為指數,醜數乘醜數也依舊是醜數。隻要能正确的組合a,b,c,取不同的值,然後可以得到從小到達的醜數,那麼題目就容易做出來了。可是怎麼才能實作呢。
考慮兩個不等式, 對于p,2*p<3*p<5*p, 對于2,不同數p<q,則2*p<2*q。
一開始第一個醜數是1,這時候候選的醜數有 1*2 、1*3、1*5 ,找出他們中最小的,即2,并從候選醜數中剔除2。
此時第二個醜數是2了,這時候候選的醜數有1*3、1*5、2*2、2*3、2*5。若我們不通過上面兩個不等式将候選集縮小,則會導緻需要比較的數的個數變得非常多,那時間複雜度特别高。此時,觀察到1*3<2*3、1*5<2*5是以可以直接剔除後面這兩個數。
進而隻需要比較2*2 、1*3、1*5了。之後都可以按照這個規則。會發現通過底數或者指數來比較,每次都會剔除到3個數。
java程式:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index<7)
return index;
int[] arr = new int[index];
arr[0]=1;
int t1=0,t2=0,t3=0;
for(int i =1;i<index;i++){
arr[i]=Math.min(2*arr[t1],Math.min(3*arr[t2],5*arr[t3]));
if(arr[t1]*2==arr[i])t1++;
if(arr[t2]*3==arr[i])t2++;
if(arr[t3]*5==arr[i])t3++;
}
return arr[index-1];
}
}