《劍指offer》刷題系列 (六十一)醜數

2021-10-08 08:39:44 字數 908 閱讀 6196

我們把只包含質因子 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 陣...