日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文巾解题 264. 丑数 II (剑指 Offer 49. 丑数)

發布時間:2025/4/5 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文巾解题 264. 丑数 II (剑指 Offer 49. 丑数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1 題目描述

2 解題方法

方法1:最小堆儲存數組

同時設置一個集合存放我們已經考慮過的數,每看到一個丑數n,把2n,3n,5n放入這個最小堆。

class Solution:def nthUglyNumber(self, n: int) -> int:lst=[1]ret=-1s={1}heapq.heapify(lst)while(n!=0):ret=heapq.heappop(lst)n=n-1if(2*ret not in s):s.add(2*ret)heapq.heappush(lst,2*ret)if(3*ret not in s):s.add(3*ret)heapq.heappush(lst,3*ret)if(5*ret not in s):s.add(5*ret)heapq.heappush(lst,5*ret)print(ret)return ret

?

方法2:動態規劃

方法1使用動態堆的話,會預先存儲較多的丑數,導致空間復雜度較高。同時,維護最小堆的話也會導致時間復雜度較高。

?

我們可以使用動態規劃的方法:

定義數組dp,其中dp[i]表示第i個丑數(dp[1]=1)

如何得到其他的丑數呢?我們定義三個指針p2,p3,p5,表示下一個預備丑數是當前指針指向的丑數乘以對應的質因數(初始的時候,三個指針的數值都是1)。

對于后面的i,我們令dp[i]=min(dp[p2]*2,dp[p3]*3,dp[p5]*5),然后分別比較dp[i]和dp[p2]*2,dp[p3]*3,dp[p5]*5是否相等,如果相等則將對應的指針+1。(相等說明這個pi指針代表的數已經被考慮過了(要么是被自己對應的數,要么是被其他數))

?

正確性證明

計算d[i]的時候,指針px的含義是使得dp[j]*x>dp[i-1]的最小下標,即j>=px的時候,dp[j]*x>dp[i-1];j<px的時候,dp[j]*x<=dp[i-1]。

所以,在計算dp[i]的時候,dp[p2]*2,dp[p3]*3,dp[p5]*5都大于dp[i-1];同時dp[p2-1]*2,dp[p3-1]*3,dp[p5-1]*5都小于等于dp[i-1]。

令dp[i]=min(dp[p2]*2,dp[p3]*3,dp[p5]*5),那么這個就是大于dp[i-1]的最小丑數。

圖解

1,一開始,dp[1]=1,三個指針都指向1。

2,計算dp[2],三個指針都指向1,所以分別乘以因子后是2,3,5;2最小,p2加一,dp[2]=2。

3?計算dp[3]

4 計算dp[4]

5 計算dp[5]

class Solution:def nthUglyNumber(self, n: int) -> int:lst=[0,1]p2=1p3=1p5=1for i in range(2,n+1):lst.append(min(lst[p2]*2,lst[p3]*3,lst[p5]*5))if(lst[i]==lst[p2]*2):p2+=1if(lst[i]==lst[p3]*3):p3+=1if(lst[i]==lst[p5]*5):p5+=1return lst[n]

總結

以上是生活随笔為你收集整理的文巾解题 264. 丑数 II (剑指 Offer 49. 丑数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。