每日一題 劍指 Offer 49 醜數

2021-10-07 18:31:38 字數 2209 閱讀 6624

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 可以發現...