tag:動態規劃 小根堆
難易程度:中等
題目描述:
我們把只包含質因子 2、3 和 5 的數稱作醜數(ugly number)。求按從小到大的順序的第 n 個醜數。
示例:
輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數。
注意
1. 1是醜數
2. n < 1690
本題難點醜數的定義以及查詢的方式
具體思路醜數隻包含因子 2,3,5 ,因此有 「醜數 = 某較小丑數 × 某因子」 (例如:10=5×2)
設已知長度為 n 的醜數序列 x1,x2,⋯,xn ,求第 n+1 個醜數 xn+1 。根根據遞推性質,醜數 x n+1 只可能是以下三種情況其中之一(索引 a,b,c 為未知數):
x n+
1=
=\left\ x_ \times 2 & , a \in[1, n] \\ x_ \times 3 & , b \in[1, n] \\ x_ \times 5 & , c \in[1, n] \end\right.
xn+1=
⎩⎨⎧
xa×
2xb
×3xc
×5
,a∈[
1,n]
,b∈[
1,n]
,c∈[
1,n]
由於 x n+1 是最接近x n的醜數,因此索引 a,b,c 需滿足以下條件:
x_ \times 2>x_ \geq x_ \times 2 & , \text x_ \text x_ \text \\ x_ \times 3>x_ \geq x_ \times 3 & , \text x_ \text x_ \text \\ x_ \times 5>x_ \geq x_ \times 5 & , \text x_ \text x_ \text \end\right.
⎩⎨⎧xa
×2>xn
≥xa
−1×
2xb
×3>xn
≥xb
−1×
3xc
×5>xn
≥xc
−1×
5,即
xa為首個乘以
2後大於xn
的醜數,即
xb為首個乘以
3後大於xn
的醜數,即
xc為首個乘以
5後大於xn
的醜數
若索引 a,b,c 滿足以上條件,則可使用遞推公式計算下個醜數 xn+1 ,其為三種情況中的最小值,
即:xn+1=min(xa × 2, xb × 3, xc × 5)
動態規劃思想:
注意: dp[0]=1,第乙個醜數為 1 ;
class
solution
if(dp[i]
== n3)
if(dp[i]
== n5)
}return dp[n-1]
;}}
複雜度分析:
解題思路小根堆,要去找第n個醜數,首先想到的就是乙個個去生成。uglynum=2^x ∗3^y ∗5^z ,由 1 生成了 2、3、5 ,接著 2、3、5 利用前面公式繼續生成。生成過程是先放小的,並且我們需要去重,去重就需要用到 set
**
class
solution
;for
(long prime : primes)
long num =1;
for(
int i =
1; i < n; i++)}
}return
(int
) num;
}}
每日一題 劍指 Offer 49 醜數
tag 動態規劃 小根堆 難易程度 中等 題目描述 我們把只包含質因子 2 3 和 5 的數稱作醜數 ugly number 求按從小到大的順序的第 n 個醜數。示例 輸入 n 10 輸出 12 解釋 1,2,3,4,5,6,8,9,10,12 是前 10 個醜數。注意 1.1是醜數 2.n 169...
劍指offer 49題 醜數
首先醜數m就是能被n 2 3 5 整除,即m n 0 所以我們可以對每個數來逐一判斷是不是可以被2 3 5整除。判斷乙個數是不是醜數 bool ugly int m while m 3 0 while m 5 0 return m 1 true false int getungly1 int ind...
劍指Offer 49 醜數
我們把只包含因子2 3和5的數稱為醜數。求按從小到大的順序的第1500個醜數。例 6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當作第乙個醜數。遍歷數字,對每個數字判斷是否只包含2 3 5因子。問題在於,有很多無用的計算,增加時間複雜度。時間複雜度 o n 空間複雜度 o 1 可以發現...