Leecode刷题C语言之超过阈值的最小操作数②

执行结果:通过

执行用时和内存消耗如下:

 

 

 

// 最小堆的节点结构体
typedef struct {
    long long* heap;
    int size;
    int capacity;
} MinHeap;

// 初始化最小堆
MinHeap* createMinHeap(int capacity) {
    MinHeap* minHeap = (MinHeap*)malloc(sizeof(MinHeap));
    minHeap->size = 0;
    minHeap->capacity = capacity;
    minHeap->heap = (long long*)malloc(capacity * sizeof(long long));
    return minHeap;
}

// 插入元素到最小堆
void insert(MinHeap* minHeap, long long value) {
    if (minHeap->size == minHeap->capacity) {
        return; // 堆已满
    }
    int i = minHeap->size++;
    while (i != 0 && value < minHeap->heap[(i - 1) / 2]) {
        minHeap->heap[i] = minHeap->heap[(i - 1) / 2];
        i = (i - 1) / 2;
    }
    minHeap->heap[i] = value;
}

// 移除并返回最小堆的最小元素
long long extractMin(MinHeap* minHeap) {
    if (minHeap->size <= 0) {
        return -1;
    }
    if (minHeap->size == 1) {
        minHeap->size--;
        return minHeap->heap[0];
    }
    long long root = minHeap->heap[0];
    minHeap->heap[0] = minHeap->heap[--minHeap->size];
    int i = 0;
    while (2 * i + 1 < minHeap->size) {
        int leftChild = 2 * i + 1;
        int rightChild = 2 * i + 2;
        int smallest = i;
        if (leftChild < minHeap->size && minHeap->heap[leftChild] < minHeap->heap[smallest]) {
            smallest = leftChild;
        }
        if (rightChild < minHeap->size && minHeap->heap[rightChild] < minHeap->heap[smallest]) {
            smallest = rightChild;
        }
        if (smallest != i) {
            long long temp = minHeap->heap[smallest];
            minHeap->heap[smallest] = minHeap->heap[i];
            minHeap->heap[i] = temp;
            i = smallest;
        } else {
            break;
        }
    }
    return root;
}

// 释放最小堆内存
void freeMinHeap(MinHeap* minHeap) {
    free(minHeap->heap);
    free(minHeap);
}

int minOperations(int* nums, int numsSize, int k) {
    MinHeap* minHeap = createMinHeap(numsSize);
    for (int i = 0; i < numsSize; ++i) {
        insert(minHeap, nums[i]);
    }

    int operations = 0;
    while (minHeap->size >= 2 && minHeap->heap[0] < k) {
        long long x = extractMin(minHeap);
        long long y = extractMin(minHeap);
        long long newValue = x * 2 + y;
        insert(minHeap, newValue);
        ++operations;
    }

    freeMinHeap(minHeap);
    return operations;
}

解题思路:

这段代码实现了一个最小堆数据结构,并利用它来解决一个特定的问题:给定一个整数数组 nums 和一个整数 k,计算将数组中的元素通过一系列操作转换成大于或等于 k 的最小元素所需的最少操作次数。每次操作可以取出堆中的两个最小元素,将它们相加后乘以2,再将结果放回堆中。

下面是代码的解题思路:

  1. 定义最小堆结构体
    • MinHeap 结构体包含三个成员:指向堆数组的指针 heap,堆的当前大小 size,以及堆的容量 capacity
  2. 初始化最小堆
    • createMinHeap 函数分配内存并初始化一个最小堆,设置堆的大小为0,并分配足够的空间来存储指定容量的元素。
  3. 插入元素到最小堆
    • insert 函数将一个新元素添加到最小堆中。如果堆未满,它首先将元素添加到堆的末尾,然后通过上滤(bubble up)操作将其移动到正确的位置,以保持堆的性质。
  4. 移除并返回最小元素
    • extractMin 函数移除并返回堆中的最小元素(根元素)。它首先将根元素替换为堆中的最后一个元素,然后通过下滤(bubble down)操作将新的根元素移动到正确的位置。
  5. 释放最小堆内存
    • freeMinHeap 函数释放最小堆所占用的内存。
  6. 计算最少操作次数
    • minOperations 函数是解决问题的核心。它首先创建一个最小堆,并将数组 nums 中的所有元素插入堆中。
    • 然后,它进入一个循环,只要堆的大小至少为2且堆顶元素(最小元素)小于 k,就执行以下操作:
      • 从堆中取出两个最小元素 x 和 y
      • 计算新值 newValue = x * 2 + y
      • 将 newValue 插入堆中。
      • 操作次数 operations 加1。
    • 循环结束后,释放堆的内存,并返回操作次数 operations

这种方法利用了最小堆的性质,确保了每次操作都能有效地处理当前最小的元素,从而以尽可能少的操作次数达到目标值 k

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954288.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件

目录 1.QPushButton按钮 介绍 属性 Demo&#xff1a;键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo&#xff1a;点餐小程序 3.CheckBox按钮 属性 Demo&#xff1a;获取今天的形成计划 4.ToolBu…

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

StyleGaussian: Instant 3D Style Transferwith Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、辐射场 2、3D编辑 3、风格迁移 三、StyleGaussian 1、特征嵌入 2、风格迁移 3、解码 四、实验 1、不同backbone下的量化和定性指标 2、解码器设计上的测试 3、内容损失平衡 4、风格平滑插值 一、概述 提出了StyleGaussian&#x…

基于django实现类似ebay的电子商务系统全英文

完整源码项目包获取→点击文章末尾名片&#xff01;

win32汇编环境,窗口程序中组合框的应用举例

;运行效果 ;win32汇编环境,窗口程序中组合框的应用举例 ;比如在窗口程序中生成组合框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>>…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

微信小程序获取openid

2025年1月15日&#xff1a; 1、现在云服务器上安装nodejs&#xff0c;然后写个get接口&#xff1a; const express require(express); const app express();app.get(/getOpenid,(req,res)>{res.send("success"); })app.listen(3000,()>{console.log(server…

ASP.NET Core - 配置系统之配置添加

ASP.NET Core - 配置系统之配置添加 2. 配置添加 2. 配置添加 配置系统可以读取到配置文件中的信息&#xff0c;那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中&#xff0c;builder(WebApplicationBuilder 对象) 中有一个 Config…

C#中通道(Channels)的应用之(生产者-消费者模式)

一.生产者-消费者模式概述 生产者-消费者模式是一种经典的设计模式&#xff0c;它将数据的生成&#xff08;生产者&#xff09;和处理&#xff08;消费者&#xff09;分离到不同的模块或线程中。这种模式的核心在于一个共享的缓冲区&#xff0c;生产者将数据放入缓冲区&#x…

ArcSegment绘制及计算

ArcSegment绘制及计算 给定起始点、终止点和 bulge 值计算弧线中心点和半径&#xff0c;绘制ArcSegment。 import math def calculate_arc_center_and_radius(x1, y1, x2, y2, bulge):angle4*math.atan(bulge)# 计算弦中点mid_x (x1 x2) / 2mid_y (y1 y2) / 2# 计算弦长的…

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景&#xff0c;需要实现自动化系统目标&#xff1a; 标准化。 流程自助化。 可视化&#xff1a;可观测系统各项指标、包括全链路跟踪。 自动化&#xff1a;ci/cd 自动化部署。 精细化&#xff1a…

FakeLocation 1599 | 内部旧版

前言:FakeLocation又更新了,在某安上面看见一些&#xff0c;大概问题就是地图没了&#xff0c;然后有更难搞了 任务一 我们先去看看地图是怎么个事情 这里用的是百度地图就没有了哈 高德地图是有的 任务二 null 选择成功了&#xff0c;虽然是null 任务三 地图位置 虽然不显示了…

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典&#xff08;二分查找算法&#xff09;1.2、整理扑克&#xff08;插入排序算法&#xff09;1.3、货币找零&#xff08;贪心算法&#xff09; 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读&#xff0c;全文使用中文进行描述&#xff0c;最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作&#xff0c;可自行将自己的结果发给ai&#xff0c…

CSS的小知识

一、子选择器 (>) 让 CSS 样式只作用于子级和孙级元素&#xff0c;而不影响其他元素 有>是只对其子级有效&#xff0c;子选择器只会影响直接的子级元素&#xff0c;而不会影响更深层次的孙级元素 无>时是对子级、孙级、曾孙级等所有后代都有效

【经管数据】ZF数字采购采购明细数据(2015.3-2024.3)

一、数据来源&#xff1a; 原始数据来源为ZF采购网。数据涵盖了自2015年3月至2024年3月的ZF数字采购合同明细&#xff0c;反映了数字化转型在政府采购中的应用情况。 二、参考文献&#xff1a; [1] 申志轩, 祝树金, 文茜, 等. ZF数字采购与企业数字化转型[J]. 数量经济技术经济…

【Linux】Mysql部署步骤

一、JDK安装配置 在home目录下执行命令&#xff1a;mkdir Jdk 1.将JDK 上传至该文件夹&#xff0c;有些终端工具可以直接上传文件&#xff0c;比如&#xff1a;MobaXterm 可以看到安装包已经上传上来了 2.直接安装 命令&#xff1a;rpm -ivh jdk-8u311-linux-x64.rpm 3.安装成…

虚拟同步机(VSG)Matlab/Simulink仿真模型

虚拟同步机控制作为原先博文更新的重点内容&#xff0c;我将在原博客的基础上&#xff0c;再结合近几年的研究热点对其内容进行更新。Ps&#xff1a;VSG相关控制方向的simulink仿真模型基本上都搭建出来了&#xff0c;一些重要的控制算法也完成了实验验证。 现在搭建出来的虚拟…

二分查找算法——点名

一.题目描述 LCR 173. 点名 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 有0~n-1这n个数&#xff0c;但是数组中只有n-1个数&#xff0c;我们要找到消失的那个数。 三.算法原理 1.哈希表 我们先创建一个n个数的哈希表并初始化为0&#xff0c;然后将数组中的数存放…

FIDO2密码钥匙与无密码认证:打造安全便捷的数字世界

在数字化时代&#xff0c;密码曾被视为网络安全的基石&#xff0c;但随着网络攻击手段日益复杂&#xff0c;传统的密码认证方法越来越无法抵御这些挑战。对于用户来说&#xff0c;登录密码不仅繁琐易忘&#xff0c;而且一旦泄露&#xff0c;往往会导致数据泄露&#xff0c;造成…