前言:本文只提供了解題的思路,**只有想法二的,但想法二不是最優解。如果你想找乙個最好答案,可能本文不合適。如果你想一步一步接近最優答案的話,可以耐心看完。
把只包含質因子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 solutionelse 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...