每日一題 劍指 Offer 49 醜數

2022-09-03 05:48:07 字數 1508 閱讀 8481

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 是最接近x n的醜數,因此索引 a,b,c 需滿足以下條件:

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