劍指offer三十三 第n個醜數

2022-08-14 05:54:13 字數 1611 閱讀 2298

前言:本文只提供了解題的思路,**只有想法二的,但想法二不是最優解。如果你想找乙個最好答案,可能本文不合適。如果你想一步一步接近最優答案的話,可以耐心看完。

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

前20個醜數為:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36。

寫乙個判斷是否為醜數的函式,這個函式**依次將2,3,5除盡。若最後為1則是醜數

從1往後找,找滿n個醜數為止

**如下

bool panduan(int val) 

// 把3的因子

while (val % 3 == 0)

// 5

while (val % 5 == 0)

if (val == 1)

return true;

else

return false;

}

第i個醜數由前面i-1個數中的某個數 乘以 2 3 5得到,我們找的乘後的數要大於第i-1個醜數,且盡可能的小

那求第i個醜數,將前面的i-1個數依次遍歷,遍歷乙個數時 讓其 乘以2 3 5;

結果 要大於第i-1個整數,且盡可能的小。

由前面的東西給推出後面,是一種動態規劃的寫法,但存在重複計算。

**見最後;

方法2存在重複計算 算3要遍歷1、2所有 算4 還是要遍歷1、2.可以想辦法把計算結果儲存起來能起來。具體來說 醜數陣列a 存放前i-1個醜數陣列(沒有錢i-1個醜數) 乘以2 3 5後容器b

從b中取最小的數x加入到a中,然後取出的數x乘以2 3 5放入到容器b中

如此反覆直到醜數陣列a數量達到n

對於容器b 有如下兩種方式

容器:乙個set

儲存方式由兩種建乙個set 存由已知醜數得到的結果,然後取set最小的值為下乙個醜數 乘以2 3 5得到三個數加入set中

缺點是每次加入三個數後都要重新排序,因為順序不固定

容器:三個佇列

儲存方式2建立3個佇列 乘以2 3 5所得數列,這樣避免了重新排序,具體見例項

醜數陣列;

(1)醜數陣列a1

乘以2佇列|2

乘以3佇列|3

乘以5佇列|5

(2)醜數陣列1 2

乘以2 |4

乘以3|3 6

乘以5|5 10

(3)醜數陣列1 2 3

乘以2| 4 6

乘以3 |6 9

乘以5|5 10 15

想法二

class solution 

else if (uglys[j] * 3 > uglys[i - 1] && uglys[j] * 3 < min)

else if(uglys[j] * 5 > uglys[i - 1] && uglys[j] * 5 < min)

}uglys.push_back(min);

} return uglys[index - 1];

}};

劍指Offer 醜數(動態規劃求解) (三十三)

題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。醜數定義。實現思路 常規窮舉 乙個數如果分別整除2,3,5後,得到1,那麼這個數是醜數,時間複雜度為o n 另外...

牛客劍指offer第三十三題(醜數)

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。定義遞迴函式,該遞迴函式用於求解當前數是否是醜數。採用迭代將每個數傳入遞迴函式判斷是否是醜數,若是醜數,返回true,醜數...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...