丑数-优先队列(详细解答)

news/2024/6/18 21:39:04 标签: 数据结构, 算法, 队列, leetcode

题目:
丑数是一些因子只有2,3,5的数。数列1,2,3,4,5,6,8,9,10,12,15……写出了从小到大的前11个丑数,1属于丑数。现在请你编写程序,找出第1500个丑数是什么。

输出:The 1500’th ugly number is <…>.(<…>为你找到的第1500个丑数) 注意:<…>是你找到的数,输出中没有尖括号; 2、输出完应换行。

解题思路:
首先我们要找出数列的规律,我们仔细观察可以发现,任意数字x,他的丑数为x、2x、3x、5x,然后们通过一个最小堆形成的优先队列,每次取出最小元素,然后判断它的2x、3x、5x是否在队列,如果不在那么就push()进优先队列,那么我们判断是否在队列中呢,熟悉set集合的同学,可以清楚知道,set不允许重复元素,并且set可以帮助我们排序,所以我们**用set集合去除重复元素!**最后整体利用for循环i从1开始,直到i=1500就可以判断第1500个丑数!

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;//需要注意,我们如果开int可能越界,后面的丑数可能很大。
const int coeff[3]= {2,3,5};
int main()
{
    priority_queue<LL,vector<LL>,greater<LL> >pq; //最小堆形成的优先队列
    set<int> s;//set帮助我们去除重复元素
    pq.push(1);
    s.insert(1);
    for(int i=1;; i++)
    {
        LL t=pq.top(); //每次拿出最小的丑数
        pq.pop();
        if(i==1500)
        {
            printf("The 1500'th ugly number is %d.\n",t);
            break;
        }

        for(int i=0; i<3; i++)
        {
            if(!s.count(t*coeff[i]))
            {
                s.insert(t*coeff[i]);
                pq.push(t*coeff[i]);
            }
        }
    }
    return 0;
}


http://www.niftyadmin.cn/n/860385.html

相关文章

Unix Is命令(UVa 400)详细解答

题目: 输入正整数n 以及n 个文件名&#xff0c;排序后按列优先的方式左对齐输出。假设最长文件名有M 字符&#xff0c;则最右边有M 字符&#xff0c;其他列都是M2 字符。 题目分析: 有n个文件名,其中最长的文件名有M个字符,一下面输入为例,最长的是Mr._French(共有10个字符),然…

超级楼梯(递推)

题目: 有一楼梯共M级&#xff0c;刚开始时你在第一级&#xff0c;若每次只能跨上一级或二级&#xff0c;要走上第M级&#xff0c;共有多少种走法&#xff1f; 输入: 输入数据首先包含一个整数N&#xff0c;表示测试实例的个数&#xff0c;然后是N行数据&#xff0c;每行包含一…

铺方格(升级版递推)详细解答

题目: 有一个大小是2xN的网格,现在需要用2种规格的骨牌铺满,骨牌的规格分别是2x1和2x2,请计算一共有多少铺设的方法。(从左向右铺) 输入: T组数据,N网格列数 (0<N<50) 输出: 所有方案m Sample Input 1 3 2 Sample Output 1 5 3 解题思路: 这道题和超级楼梯有异曲同工…

LIS最长上升子序列

LIS:从一串数字序列,找出连续递增的子序列,并且要求子序列最长! 举例: 一段序列:1,6,2,3,7,5,9,4,11 最长上升子序列为:1,2,3,7,9,11 那么我们如何通过代码实现呢? 我们需要一个数组f,然后通过f记录每一个数字的最大上升子序列。 初始时每一个f[i]1,因为那怕找不到任意一个子…

LCS最长公共子序列

最长公共子序列:顾名思义从两段序列中选出,其中连续并且相同的子串 举例 a串:1 5 7 9 6 3 b串:1 6 3 2 1 5 最长公共子序列 c串:1 6 3 我们如何实现呢? (假设a串有n个数字,b串有m个数字) 我们需要一个二位数组f,通过这个二维数组存放 f(i,j) f(i,j)含义:表示a串前i个数字,和b串…

01背包问题相关优化大全(二维到一维)

下面是普通版本的01背包代码! int dp[105][1005];for(int i1;i<m;i)for(int jt;j>0;j--){if(j>w[i]){dp[i][j]max(dp[i-1][j-w[i]]v[i],dp[i-1][j]);}else{dp[i][j]dp[i-1][j];}}滚动数组优化二维01背包 我们可以看到dp数组需要很大,至少超过2行! 那么我们想一想可不…

完全背包问题(详细解答)

首先完全背包问题需要01背包问题做铺垫,如果读者01背包问题没有解决,一定要理解之后,在看完全背包问题,包括01背包的优化! 这里是01背包 这里是01背包的全部优化 好,我们开始完全背包! 完全背包定义 有N种物品和一个容量为V的背包&#xff0c;每种物品都有无限件可用。第i种物…

快速幂+矩阵优化斐波那契数列(超详细教程)

文章目录前言一、快速幂二、矩阵优化斐波那契数列1.矩阵相关知识2.斐波那契数列用矩阵表示3.O(log2n)的斐波那契数列三、全部实现代码前言 我们首先讲解快速幂,然后利用快速幂优化矩阵乘法,将O(n)算法变为O(log2n),紧接着我们用矩阵实现斐波那契数列! 一、快速幂 通常我们算…