264 ugly number II 丑数

问题描述

An ugly number is a positive integer whose prime factors are limited to 2, 3, and 5.

Given an integer n, return the nth *ugly number*.

解释:

一个丑数是一个正整数,其公因子只有2,3,5。给定数字n,求第n个丑数

案例:

Input: n = 10
Output: 12
Explanation: [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] is the sequence of the first 10 ugly numbers. 
解析:第一个丑数是1,第二个丑数是2,以此类推
Input: n = 1
Output: 1
Explanation: 1 has no prime factors, therefore all of its prime factors are limited to 2, 3, and 5.
解释: 第一个丑数是1

基本思想

这个跟换零钱一样类似,几个数字的组合。构造数组dp, 第n个丑数一定是n之前的丑数 × 2 ,× 3, × 5得到的。所以维持i,j,k三个指针, 使得 dp[n]一定是在 dp[i] * 2, dp[j] * 3, dp[k] * 5 这三个数中取最小的。即 dp[n]取决于dp[i],dp[j],dp[k]。

综上:

  • dp[n] = min(dp[i] * 2, dp[j] * 3, dp[k] * 5)
  • 其中dp[i]的更新规则如下:如果dp[i]*2 <= dp[n],则 i++

时间复杂度\(O(n^2)\)

代码

C++

    int nthUglyNumber(int n) {
        if (n<=1) return 1;
        int i,j,k;
        i=0;
        j=0;
        k=0;
        vector<int> dp(n,0);
        dp[0] = 1;
        for(int t=1;t<n;++t) {
            dp[t] = min(min(dp[i]*2,dp[j]*3), dp[k]*5);
            if (dp[i]*2 <= dp[t]) ++i;
            if (dp[j]*3<= dp[t]) ++j;
            if (dp[k]*5<=dp[t]) ++k; 
        }
        return dp[n-1];
    }

python

   def nthUglyNumber(self, n: int) -> int:
       if n<=0: return 0
       i=j=k = 0
       dp = [0] * n
       dp[0] = 1
       for e in range(1,n):
           dp[e] = min(min(dp[i]*2, dp[j]*3), dp[k]*5);
           if dp[i]*2 <= dp[e]: i = i + 1  # i++ 和 i = i+1 是不一样的
           if dp[j]*3 <= dp[e]: j = j + 1
           if dp[k]*5 <= dp[e]: k = k + 1
       return dp[n-1]
posted @ 2024-05-15 19:46  金字塔下的蜗牛  阅读(3)  评论(0编辑  收藏  举报