当前位置: 首页 > news >正文

面试经典150题 堆

215.数组中的第K个最大元素
建堆算法实现-CSDN博客

215. 数组中的第K个最大元素

中等

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: 

[3,2,1,5,6,4],
 k = 2
输出: 5

示例 2:

输入:  
[3,2,3,1,2,4,5,5,6], 
k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

进行建堆操作,每次将堆中的第一个元素(最大元素)执行删除操作,删除K次后,最近一次删除掉的元素即为数组中的第K个最大元素 

        

class Solution {// 找到数组中第 k 大的元素public int findKthLargest(int[] nums, int k) {// 构建初始堆heapify(nums, nums.length);int size = nums.length;// 进行 k 次操作,每次将堆顶元素与末尾元素交换,并调整堆for (int i = 0; i < k; i++) {// 交换堆顶元素和当前末尾元素swap(nums, 0, size - 1);// 调整堆,排除已确定的末尾元素down(nums, 0, --size);}// 返回堆顶元素,即第 k 大的元素return nums[size];}// 构建初始堆的方法private static void heapify(int[] nums, int size) {// 从最后一个非叶子节点开始,逐步调整堆for (int i = size / 2 - 1; i >= 0; i--) {down(nums, i, size);}}// 堆的下潜操作private static void down(int[] array, int parent, int size) {while (true) {int max = parent;int left = parent * 2 + 1;int right = left + 1;// 如果左子节点存在且大于当前最大元素,更新最大元素索引if (left < size && array[left] > array[max]) {max = left;}// 如果右子节点存在且大于当前最大元素,更新最大元素索引if (right < size && array[right] > array[max]) {max = right;}// 如果最大元素就是当前父节点,说明堆调整完成,退出循环if (max == parent) {break;}// 交换最大元素和父节点swap(array, max, parent);// 更新父节点索引,继续调整parent = max;}}// 交换数组中两个元素的方法private static void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}
}

502.IPO
502. IPO

困难

假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。

给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。

最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。

答案保证在 32 位有符号整数范围内。

示例 1:

输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]
输出:4
解释:
由于你的初始资本为 0,你仅可以从 0 号项目开始。
在完成后,你将获得 1 的利润,你的总资本将变为 1。
此时你可以选择开始 1 号或 2 号项目。
由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。
因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。
示例 2:

输入:k = 3, w = 0, profits = [1,2,3], capital = [0,1,2]
输出:6
提示:

1 <= k <= 105
0 <= w <= 109
n == profits.length
n == capital.length
1 <= n <= 105
0 <= profits[i] <= 104
0 <= capital[i] <= 109
理解题意:我们有一个现有的资本,一个所需资本和利润对应的投资元素,我们要进行投资资本就必须大于所需资本,要求K次投资能获得的最大资本。

贪心思想:在所有能投资的项目中,我们投资利润最大的那个。

思路:将资本和利润一一对应后,按照所需资本进行排序。

逐个遍历,将所有能投资的项目放入大根堆中,通过大根堆的性质选出利润最大的那一个进行投资,赚取利润后,再将我们目前能新投资的项目(我们赚取了利润,资本变多了)放入大根堆中,重复这个过程,直到投资的k次机会用完或者没有能投资的项目 

class Solution {// 找到最大化资本的方法public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {// 创建一个二维数组,用于存储资本和利润信息int total[][] = new int[profits.length][2];for (int i = 0; i < profits.length; i++) {// 将资本存入二维数组的第一列total[i][0] = capital[i];// 将利润存入二维数组的第二列total[i][1] = profits[i];}// 按照资本从小到大对二维数组进行排序Arrays.sort(total, (a, b) -> a[0] - b[0]);// 创建一个大顶堆优先队列,用于存储可选择的最大利润项目PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);int cur = 0;for (int i = 0; i < k; i++) {// 当还有未处理的项目且当前项目的资本小于等于当前资本 w 时while (cur < profits.length && total[cur][0] <= w) {// 将当前项目的利润加入优先队列pq.add(total[cur][1]);cur++;}// 如果优先队列不为空if (!pq.isEmpty()) {// 取出最大利润项目并增加当前资本 ww += pq.poll();} else {// 如果优先队列为空,无法进行操作,退出循环break;}}// 返回最终的资本 wreturn w;}
}

373.查找和最小的K对数字 
373. 查找和最小的 K 对数字

中等

给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。

请找到和最小的 k 个数对 (u1,v1),  (u2,v2)  ...  (uk,vk) 。

示例 1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
     [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
示例 2:

输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
     [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
提示:

1 <= nums1.length, nums2.length <= 105
-109 <= nums1[i], nums2[i] <= 109
nums1 和 nums2 均为 升序排列
1 <= k <= 104
k <= nums1.length * nums2.length
首先我们明确,最小的数字对一定是nums1[0] + nums2[0],比他们稍大的可能是nums1[0 + 1] + nums2[0]或者nums1[0] + nums2[0 + 1],这种情况对每一个找到的数字对都适用。

我们优先将nums1[0] + nums2[0]加入小顶堆中,采取循环的方式,每次找到一个最小数字对,就加入所有可能的下一个最小数字对,注意当我们找到的不是第一个最小数字对时(nums1[0] + nums2[0]),堆中所有的元素和新加入的数字对都有可能是下一个最小数字对。

注意这里有一个特殊情况,看例子2,我们所找到的数字对,元素可能是相同的,但是索引不能是相同的,而我们在加入数字对的过程中,可能加入索引相同的数字对,造成重复的情况,所以我们要使用hash进行去重,如果找到的数字对的索引我们已经使用过了,我们就不能把他们对应的元素加入结果数组中,去重后k++,因为我们没有找到一个新的最小数字对。

class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {// 创建一个优先队列,用于存储二元组,按照两数之和的大小进行排序PriorityQueue<int[]> pq = new PriorityQueue<>(k, (o1, o2) -> {return nums1[o1[0]] + nums2[o1[1]] - nums1[o2[0]] - nums2[o2[1]];});// 用于存储最终结果的列表List<List<Integer>> result = new ArrayList<>();int length1 = nums1.length;int length2 = nums2.length;// 如果任一数组为空,直接返回空结果列表if (length1 == 0 || length2 == 0) {return result;}// 将第一个二元组(0,0)加入优先队列pq.offer(new int[]{0, 0});// 创建一个哈希表,用于存储已经处理过的二元组列表HashMap<List<Integer>, Integer> map = new HashMap<>();// 循环直到 k 次或者优先队列为空while (k-- > 0 &&!pq.isEmpty()) {// 取出优先队列中的二元组int[] temp = pq.poll();// 创建一个临时列表,存储当前二元组的索引List<Integer> mapList = new ArrayList<>();mapList.add(temp[0]);mapList.add(temp[1]);// 如果该二元组已经处理过,增加 k 的值,继续下一次循环if (map.containsKey(mapList)) {k++;continue;}// 将当前二元组列表加入哈希表map.put(mapList, 0);// 创建一个列表,存储当前二元组对应的两个数List<Integer> list = new ArrayList<>();list.add(nums1[temp[0]]);list.add(nums2[temp[1]]);// 将当前二元组对应的两个数的列表加入结果列表result.add(list);// 如果第一个数组还有下一个元素,将下一个二元组加入优先队列if (temp[0] + 1 < length1) {pq.offer(new int[]{temp[0] + 1, temp[1]});}// 如果第二个数组还有下一个元素,将下一个二元组加入优先队列if (temp[1] + 1 < length2) {pq.offer(new int[]{temp[0], temp[1] + 1});}}// 返回最终结果列表return result;}
}

相关文章:

面试经典150题 堆

215.数组中的第K个最大元素 建堆算法实现-CSDN博客 215. 数组中的第K个最大元素 中等 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必…...

day-62 每种字符至少取 K 个

思路 滑动窗口&#xff1a;改变思路&#xff0c;从左右两边取字符&#xff0c;是a b c三个字符至少被取k次&#xff0c;那么意味着如果我们知道字符串中a b c的出现个数&#xff0c;那么可以知道取走后剩下子串a b c的个数&#xff0c;问题转化为了求最长子串 解题过程 如果a …...

免费好用!AI声音克隆神器,超级简单,10秒就能克隆任何声音!(附保姆级教程)

今天下午还有读者问&#xff1a; 有没有能克隆声音的 AI 工具&#xff1f; 其实剪映很早就上了克隆声音的功能。 只需要按要求朗读例句&#xff0c;或者上传本地的音视频文件&#xff0c;就可以克隆声音了。 操作非常简单&#xff0c;效果也不错&#xff0c;可以试试。 除了…...

LeetCode146 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …...

【Java】包装类【主线学习笔记】

文章目录 前言包装类基本数据类型与包装类之间的转换基本数据类型转换为包装类可以通过以下几种方式&#xff1a;包装类转换为基本数据类型可以通过以下几种方式&#xff1a;初始化值不同与String之间的转换 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台…...

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等&#xff0c;并可以通过信息窗口展示详细信息。 点注释支持功能&#xff1a; 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格&#xff0c;同时也支持自定…...

uniapp js怎么根据map需要显示的点位,计算自适应的缩放scale

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

Mysql 架构

目录 1.1 Mysql 逻辑架构图 1.2 SQL 的执行流程 1.3 SQL 书写顺序和执行顺序 1.4 Mysql 日志文件 1.4.1. 二进制日志&#xff08;Binary Log&#xff09; 1.4.2. 错误日志&#xff08;Error Log&#xff09; 1.4.3. 慢查询日志&#xff08;Slow Query Log&#xff09; 1.…...

C语言 | Leetcode C语言题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; #define MAX_LEVE_SIZE 1000 #define MAX_NODE_SIZE 10000int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {int ** ans (int **)malloc(sizeof(int *) * MAX_LEVE_SIZE);*returnColumnSizes (int *)mal…...

Python中列表常用方法

# 定义列表: # 定义一个空列表 my_list []# 定义一个包含不同类型元素的列表 my_list [1, 2, 3, a, b, c, 2.5, True]# 定义一个嵌套列表&#xff08;列表中包含列表&#xff09; my_list [[1, 2, 3], [a, b, c], [2.5, True]]print(my_list[0]) # [1, 2, 3]# 访问元素: my…...

『功能项目』下载Mongodb【81】

下载网址&#xff1a;Download MongoDB Community Server | MongoDB 点击安装即可 选择Custom 此时安装已经完成 桌面会创建图标 检查是否配置好MongoDB 输入cmd命令行 Windows键 R 打开命令行 输入cmd 复制安装路径 复制data路径 如果输出一大串代码即配置mongdb成功...

图像特征提取-SIFT

文章目录 一、定义与原理二、主要步骤三、特点与优势四、代码运用五、应用领域 图像特征提取中的SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不变特征变换&#xff09;是一种强大的局部特征提取算法&#xff0c;广泛应用于计算机视觉和图像处理领域。以…...

ElasticSearch分页查询性能及封装实现

Es的分页方式 fromsize 最基本的分页方式&#xff0c;类似于SQL中的Limit语法&#xff1a; //查询年龄在12到32之间的前15条数据 {"query":{"bool":{"must":{"range":{"user_age":{"gte":12,"lte":3…...

Python精选200Tips:176-180

针对图像的经典卷积网络结构进化史及可视化 P176--LeNet-5【1988】模型结构说明模型结构代码模型结构可视化 P177--AlexNet【2012】模型结构及创新性说明模型结构代码模型结构可视化 P178--VGGNet【2014】VGG19模型结构及创新性说明VGG19模型结构代码VGG19模型结构可视化 P179-…...

【Kotlin 集合概述】可变参数vararg、中缀函数infix以及解构声明(二十)

导读大纲 1.1 使用集合: vararg、infix 调用和解构声明1.1.1 扩展 Java 集合 API1.1.2 vararg: 接受任意数量参数的函数1.1.3 处理pairs: Infix 调用和解构声明 1.1 使用集合: vararg、infix 调用和解构声明 本节将介绍 Kotlin 标准库中用于处理集合的一些函数 同时,还介绍一些…...

unity安装报错问题记录

unity安装报错问题记录 今天下载了unity&#xff0c;一路安装下来&#xff0c;遇到了两个问题&#xff1a; Microsoft Visual Studio Community 2022 Install failed: Validation Failed 查询资料提到本机已安装&#xff0c;实际本机未安装。 解决了半天&#xff0c;大致有…...

秋招|面试|群面|求职

秋招|面试|群面|求职 自我介绍30s-1min&#xff0c;首先是清楚的介绍自己的名字/专业等个人信息&#xff0c;面试岗位&#xff0c;也可以介绍一下对于岗位的理解。然后介绍一下过往经历中最亮眼的几点&#xff0c;主要是为了突出和岗位的适配程度。群面&#xff0c;我觉得最重…...

【Kubernetes】日志平台EFK+Logstash+Kafka【理论】

一&#xff0c;日志处理方案 方案一&#xff0c;【EFK】&#xff1a;Elasticsearch Fluentd&#xff08;或Filebeat&#xff09; Kibana Elasticsearch&#xff08;简称&#xff1a;ES&#xff09;&#xff1a;实时&#xff0c;分布式存储&#xff0c;可扩展&#xff0c;日…...

基于SpringBoot+Vue+MySQL的教学资料管理系统

系统展示 管理员后台界面 教师后台界面 系统背景 在当今信息化高速发展的时代&#xff0c;教育机构面临着日益增长的教学资料管理需求。为了提升教学管理的效率&#xff0c;优化资源的配置与利用&#xff0c;开发一套高效、便捷的教学资料管理系统显得尤为重要。基于SpringBoot…...

动态规划day45:编辑距离|115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离(动规终极好题)

动态规划day45:编辑距离|115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离(动规终极好题&#xff09; 115. 不同的子序列583. 两个字符串的删除操作72. 编辑距离(动规终极好题) 115. 不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...