LintCode刷题之路(四):丑数

本文介绍了一种高效算法,用于找出仅包含素因子2、3、5的第n小的数,即所谓的丑数。通过动态规划的方法,利用三个指针分别跟踪2、3、5倍数的生成过程,确保了生成的每个丑数都是前一个丑数乘以这三个素因子之一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计一个算法,找出只含素因子2,3,5 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…
样例
如果n = 9, 返回 10
挑战
要求时间复杂度为O(nlogn)或者O(n)

思路:
根据丑数的定义可知,每一个丑数都是由前面的丑数生成。例如:2是由1*2得来,3是由1 *3得来。

C++:

class Solution {
public:
    /**
     * @param n: An integer
     * @return: the nth prime number as description.
     */

    int min(int a,int b)
    {
        if(a<b)
        {
            return a;
        }
        else
        {
            return b;
        }
    }
    int nthUglyNumber(int n) {
        // write your code here
        int *ugly = new int[n];
        ugly[0] = 1;
        int num_2 = 0;
        int num_3 = 0;
        int num_5 = 0;

        for(int i=1;i<n;i++)
        {
            ugly[i] = min(min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5);
            //下一个生成的丑数,是由已生成的最大的2丑数、3丑数、5丑数当中最小的来生成的。
            if(ugly[i]/ugly[num_2]==2)
            {
                num_2++;
            }
            if(ugly[i]/ugly[num_3]==3)
            {
                num_3++;
            }
            if(ugly[i]/ugly[num_5]==5)
            {
                num_5++;
            }

        }
        return ugly[n-1];

    }
};

Py3:

class Solution:
    """
    @param n: An integer
    @return: the nth prime number as description.
    """
    def nthUglyNumber(self, n):
        # write your code here
        ugly = [1]
        num_2,num_3,num_5 = 0,0,0
        for i in range(1,n):
            Min = min(min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5)
            ugly.append(Min)
            if ugly[i]/ugly[num_2]==2:
                num_2 += 1
            if ugly[i]/ugly[num_3]==3:
                num_3 +=1
            if ugly[i]/ugly[num_5]==5:
                num_5 += 1

        return ugly[n-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值