把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
不用計算每乙個整數是不是醜數,其實下乙個醜數是前某個醜數乘2或3或5得到的。
我們用乙個陣列按順序存下每乙個醜數,然後根據這些醜數計算下乙個
對乘2而言,肯定存在某個醜數t2,排在它之前的每個醜數乘2的結果都小於已有的最大醜數,在它之後的每個醜數乘2結果都會太大,我們只需要記下這個位置,每次生成新醜數的時候更新這個位置。同理,乘3和乘5也都要維護乙個這樣的位置
就是每個醜數都是用過x2、x3或者x5得來的,t2、t3和t5只是記錄每個已有的醜數中每個數乘2、3、5的邊界,它們前面的數都是已經乘過的,肯定比現有的最大的醜數小,所以只比較後面的陣列中的醜數所乘的結果,取其中最小的乙個
public class solution
if (index == 1)
int result = new int[index];
result[0] = 1;
int resultpoint = 1;
int point2 = 0;
int point3 = 0;
int point5 = 0;
while (resultpoint < index)
if (result[point3] * 3 == result[resultpoint])
if (result[point5] * 5 == result[resultpoint])
resultpoint++;
} return result[resultpoint - 1];
}public int min(int n1, int n2, int n3)
}
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...
劍指Offer 醜數
我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...