剑指 Offer 49. 丑数【力扣】

该博客主要介绍了如何利用最小堆解决找到第n个只包含因子2,3,5的数的问题。通过创建一个最小堆并不断更新堆中的元素,避免重复,并在每次删除最小元素后更新新的2,3,5的倍数,最终找到第n个丑数。

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

题意理解

找出所有只有包含2,3,5因子的数,排序得到第n个数。

问题分析

思路奇特

用最小堆,用最小数乘2,3,5,放入堆,有重复,剔除重复数,每次把最小数删除,最小数一定是最小的。但是堆里其他数不一定是最小的。

其他

学习

力扣icon-default.png?t=L9C2https://leetcode-cn.com/problems/chou-shu-lcof/solution/chou-shu-by-leetcode-solution-0e5i/

链接

class Solution {
public:
    int nthUglyNumber(int n) {
        if (n == 1) return 1;
        priority_queue<long, vector<long>, greater<long>> my_que;
        unordered_set<long> my_set;
        my_que.push(1);
        my_set.insert(1);
        for(int i = 2; i <= n; i++) {
            //取最小值
            long val = my_que.top();
            //cout << "i order " << i << '\t' << order << endl;
            //if (i == n) return val;
            //cout << i << '\t' << n << endl;
            //删最小值
            my_que.pop();

            //插入三个值,如果重复,不插入,每插入就要order增1,到了n就break
            long val1 = val * 2;
            if (!my_set.count(val1)) {
                my_que.push(val1);
                my_set.insert(val1);
            }

            long val2 = val * 3;
            if (!my_set.count(val2)) {
                my_que.push(val2);
                my_set.insert(val2);
            }

            long val3 = val * 5;
            if (!my_set.count(val3)) {
                my_set.insert(val3);
                my_que.push(val3);
            }

            //cout << "val val1 val2 val3 " << val << '\t' << val1 << '\t' << val2 << '\t' << val3 << endl;
        }
        return my_que.top();
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值