我們把只包含質因子 2、3 和 5 的數稱作醜數(ugly number)。求按從小到大的順序的第 n 個醜數。
示例:輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數。
定義乙個陣列用來儲存n個醜數,然後逐個填滿陣列。
初始化:
預設1為醜數,所以陣列的第乙個元素為1。
開始填下乙個數字:
每個醜數都是由其前面的醜數乘以2、乘以3或者乘以5得到的,但是整個陣列需要時排序的,所以每次新增乙個新值都要保證它是當前可以加進來最小的元素。通過比較可以得到最小值。
陣列中的每個元素都會進行乘以2、乘以3和乘以5的運算,定義三個指標a,b,c,a用來記錄進行過乘以2運算的元素的位置,每運算一次,a就指向下乙個為進行乘以2運算的元素。b和c同理。
class
solution
:def
nthuglynumber
(self, n:
int)
->
int:
dp =[1
]*na,b,c =0,
0,0for i in
range(1
,n):
n1,n2,n3 = dp[a]*2
,dp[b]*3
,dp[c]*5
dp[i]
=min
(n1,n2,n3)
if n1==dp[i]
: a+=
1if n2==dp[i]
: b+=
1if n3==dp[i]
: c+=
1return dp[-1
]
時間複雜度為 o(n)
空間複雜度為 o(n)
《劍指Offer》題六十一 題六十八
六十 一 撲克牌中的順子 題目 從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王可以看成任意數字。六十二 圓圈中最後剩下的數字 題目 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個...
刷題劍指offer 醜數
題目 我們把只包含因子2 3 5的數稱為醜數。求按從小到大的順序的第1500個醜數。例如6 8都是醜數,但14不是,因為它包含因子7.習慣上我們把1當做成第乙個醜數。思路 1 逐個判斷每個整數是不是醜數,直觀但不夠高效,這樣對於每乙個數不管是不是醜數我們都要進行計算。2 根據醜數的定義,醜數應該是另...
劍指Offer系列刷題筆記彙總
本系列文章為 劍指offer 刷題筆記。刷題平台 牛客網 刷題刷的比較慢,花費了兩個多月,終於將所有題目過了一遍,牛客網一共有66道題,這次刷題主要使用c 接下來會使用python重新過一遍,並對這些寫過的文章進行更新。同時,也會重新開始刷leetcode。github專案 分類二一 線性表 1 陣...