【剑指offer】丑数(找规律)

本文介绍了一种高效算法来寻找第N个丑数。丑数是指仅包含质因子2、3和5的正整数。通过维护三个指针分别对应乘以2、3、5的丑数,算法能在O(n)的时间复杂度内找到指定位置的丑数。

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

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路

丑数的序列为{1,2,3,4,5,6,8,9,10,12…} 。每个丑数都是前面某一个丑数乘上2/3/5的结果。所以新加入的丑数必然是从原有丑数中与2,3,5乘积中最小的值。
注意:分别设置与2,3,5对应的索引号,该索引对应的数字乘上该因子后的丑数刚好大于目前最大丑数。
每次要加入一个新丑数:
(1)计算索引对应数与因子的乘积
(2)选择乘积最小的,并将对应索引+1

这样计算复杂度为O(n),并且每次只需要计算是丑数的数字;相比对所有整数去判断是否为丑数,减少了计算量。

代码

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if (index <=0)
            return 0;
        int index2 = 0;    // 该数是乘以2大于目前最大丑数的数中最小的;其序号
        int index3 = 0;
        int index5 = 0;
        vector<int> num = {1};  // 1为最小的丑数
        for (int i=1; i< index;i++){
            int mul2 = num[index2] * 2; // 与2的乘积
            int mul3 = num[index3] * 3;
            int mul5 = num[index5] * 5;

            int tmp = min(min(mul2,mul3),mul5); // 找到乘积中最小的数加入数组
            if (tmp==mul2) ++index2;            // 并将其序号+1
            if (tmp== mul3) ++index3;
            if (tmp==mul5) ++index5;
            num.push_back(tmp);
        }
        return num[index-1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值