首页 > 编程语言 >算法-丑数2-构造小根堆

算法-丑数2-构造小根堆

时间:2023-04-15 10:36:01浏览次数:43  
标签:丑数 arr index int List 算法 largest 小根堆 left

int NthUglyNumber(int n) {
    if(n == 1) return 1;
    List<long> arr = new List<long>(); // 这里用list,它会自己扩容,用数组就需要自己操作这些了
    arr.Add(1);
    int[] uglyArr = {2,3,5};
    HashSet<long> hs = new HashSet<long>();
    hs.Add(1);
    HeapInsert(arr,0);
    long result = 0;
    for(int i=0;i<n;i++)
    {
        result = heapPop(arr);
        foreach(var y in uglyArr)
        {
            long temp = result*y;
            if(!hs.Contains(temp))
            {
                hs.Add(temp);
                arr.Add(temp);
                HeapInsert(arr,arr.Count -1);
            }
        }
    }
    return (int)result;
}
long heapPop(List<long> arr)
{
    swap(arr,arr.Count-1,0);
    var rt =  arr[arr.Count-1];
    arr.RemoveAt(arr.Count-1);
    // 这里传递0 ,heapSize是数量
    HeapifyS(arr,arr.Count,0);
    return rt;
}
void HeapifyS(List<long> arr,int heapSize,int i)
{
    var left = 2*i + 1;
    // 表示有孩子
    while(left < heapSize)
    {
        var largest = left + 1 < heapSize && arr[left + 1] < arr[left] ? left + 1 : left;
        largest = arr[i] < arr[largest] ? i : largest;
        if(largest == i){
            break;
        }
        swap(arr,i,largest);
        i = largest;
        left = i*2+1;
    }   
}
// 构造小根堆
void HeapInsert(List<long> arr,int index)
{
    while (index > (index - 1) / 2 && arr[index] < arr[(index - 1) / 2])
    {
        swap(arr, index, (index - 1)/2);
        index = (index - 1) /2;
    }
}

void swap(List<long> arr,int i,int j)
{
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

 

标签:丑数,arr,index,int,List,算法,largest,小根堆,left
From: https://www.cnblogs.com/Insist-Y/p/17320597.html

相关文章

  • 《Python算法交易实战》——yfinace获取yahoo财经数据
    因为从2021年11月1日起,用户无法从中国大陆地区使用Yahoo产品与服务所以下面两个错误,都是代理配置的问题error:Notimezonefound,symbolmaybedelistederror:Nodatafoundforthisdaterange,symbolmaybedelisted以下是解决办法:1.实现强劲上网,保证你可以在浏览器......
  • 2023-04-14 算法面试中常见的查找表问题
    2023-04-14算法面试中常见的查找表问题1Set的使用LeetCode349号问题:两个数组的交集给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[9,4]说明:输......
  • 实验一 密码引擎-4-国䀄算法交叉测试
    任务详情02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)3在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后......
  • Paillier半同态加密算法及C++实现
    Paillier半同态加密系统详解及C++实现Paillier半同态加密系统详解及C++实现一、Paillier同态加密算法1.1基本概念1.2算法思路1.3加解密过程密钥生成KeyGeneration加密Encryption解密Decryption二、C++实现2.1实验环境Linux版本编译器版本2.2......
  • c/c++快乐算法第一天
    c/c++感受算法乐趣(1)开始时间2023-04-14 18:31:47结束时间2023-04-14 22:06:02前言:经过两天的学习,是不是发现编程也挺简单的。其实不然,学好算法同时也是练习编程的关键一环。接下来每周末我将会带领你感受算法的乐趣。目前题目摘自c语言趣味编程100例清华大学出版社,我会根据编......
  • 递归算法;求n的阶层
    java:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringa=sc.next();intb=Integer.parseInt(a);System.out.print(factorial(b));}p......
  • 极简cfs公平调度算法
    1.说明1>linux内核关于task调度这块是比较复杂的,流程也比较长,要从源码一一讲清楚很容易看晕2>本篇文章主要是讲清楚cfs公平调度算法如何将task在时钟中断驱动下切换调度,所以与此无关的代码一律略过3>本篇只讲最简单的task调度,略过组调度,组调度在下一篇《极简组调度-CGroup......
  • 基于L2-RLS算法的目标跟踪算法matlab仿真,可处理小范围遮挡问题
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要目标表观模型是跟踪器的重要组成部分,用来描述目标表观的特征.基于判别式模型的表观模型用来区分目标和背景;基于生成式模型的表观模型用来描述目标本身,提取出目标的特征.本文合理地融合了判别式模型和生成式模型......
  • 基于人工鱼群优化的电网规划算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要人工鱼群算法(ArtificialFishSwarmAlgorithm,简称AFSA)是受鱼群行为的启发,由国内李晓磊博士于2002年提出的一种基于动物行为的群体智能优化算法,是行为主义人工智能的一个典型应用,这种算法源于鱼群的觅食行为。......
  • 基于L2-RLS算法的目标跟踪算法matlab仿真,可处理小范围遮挡问题
    1.算法仿真效果matlab2022a仿真结果如下:            2.算法涉及理论知识概要       目标表观模型是跟踪器的重要组成部分,用来描述目标表观的特征.基于判别式模型的表观模型用来区分目标和背景;基于生成式模型的表观模型用来描述目标本身,提取......