劍指offer 醜數

2021-08-28 08:55:32 字數 1545 閱讀 8859

題目:我們把只包含因子2、3和5的數稱為醜數(ugly number)。求按從小到大的順序的第1500個醜數。例如6是醜數,但14不是,因為它包含因子7.習慣上我們把1當做第乙個醜數。

方法一:

思路:逐個判斷每個整數是不是醜數

依次從1開始判斷每個數是不是醜數,從而求出第1500個醜數,

這種方法思路簡單但是不夠高效。

**:

//是醜數 1

//不是 0

int checkuglynumber(int num)

while (num % 3 == 0)

while (num % 5 == 0)

return (num == 1) ? 1 : 0;}

int uglynumber1(int num)

} return order;

}

方法二:

建立陣列儲存已經找到的醜數(用空間換時間的做法)

前面的演算法之所以效率低,很大程度上是因為這個數是不是醜數都要對其進行計算判斷其實不是醜數。

接下來這種方法,我們不再對非醜數的整數上浪費時間。根據醜數的定義,醜數應該是另外乙個醜數乘以2、3或5的結果(1除外),因此我們可以建立乙個陣列,裡面的數是排好順序的醜數,每乙個醜數都是前面的醜數乘以2、3或者5得到的。

這種思路關鍵在於怎樣確保陣列裡面的醜數是排好序的。

假設陣列中已經有若干個醜數排好序存在陣列中,並且已有最大的醜數記為m,我們接下來分析如何生成下乙個醜數,該醜數肯定是前面醜數某乙個醜數乘以2、3或者5的結果,所以我們首先考慮把已有的醜數乘以2.在乘以2的時候,能得到若干個小於或者等於m的結果。由於是按照順序生成的,小於或者等於m肯定已經在陣列中了,我們不需要再次考慮;還會得到若干個大於m的結果,但我們只需要第乙個大於m的結果,但我們只需要第乙個大於m的結果,因為我們希望醜數是按照從小到大的順序生成的,其他更大的結果以後再說。我們把第乙個乘以2後大於m的結果記為m2。同樣第乙個乘以3大於m的結果記為m3,乘以5得到的記為m5,那麼下乙個醜數應該是m2、m3、m5中的最小值。

建立乙個空間為所能容納要求的的醜數的個數。

**:

int min(int uglymul2, int uglymul3, int uglymul5)

int uglynumber(int num)

; int next_ugly_num = 1;

ugly_arr[0] = 1;//第乙個醜數是1

int* uglymul2 = &ugly_arr[0];

int* uglymul3 = &ugly_arr[0];

int* uglymul5 = &ugly_arr[0];

while (next_ugly_num < num)

while (*uglymul3 * 3 <= ugly_arr[next_ugly_num])

while (*uglymul5 * 5 <= ugly_arr[next_ugly_num])

next_ugly_num++;

} return ugly_arr[num - 1];

}

劍指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中的最小的乙個是下乙個醜數。...