leetcode 215. 数组中的第 K个最 大的元素(堆排序,C语言)
数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素
快速排序
int cmp(const void* a, const void* b) {return *(int*)b - *(int*)a;
}int findKthLargest(int* nums, int numsSize, int k){qsort(nums, numsSize, sizeof(int), cmp);return nums[k - 1];
}堆排序```c
/* 交换 */
void swap(int* a, int* b) {int tmp = *a;*a = *b;*b = tmp;
}/* 从堆下层向上交换元素,使得堆为小根堆 */
void swim(int* nums, int k) {while (k > 1 && nums[k] < nums[k / 2]) {swap(&nums[k], &nums[k / 2]);k /= 2;}
}/* 从堆上层向下层交换元素,使得堆为小根堆 */
void sink(int* nums, int k, int numsSize) {while (2 * k < numsSize) {int child = 2 * k;if (child < numsSize && nums[child] > nums[child + 1]) {child++;}if (nums[k] < nums[child]) {break;}swap(&nums[k], &nums[child]);k = child;}
}/* 定义堆的结构体 */
typedef struct Heap {int* data;int szie;int capacity;
}T_Heap, *PT_Heap;/* 初始化一个堆 */
PT_Heap createHeap(int k) {PT_Heap obj = (PT_Heap)malloc(sizeof(T_Heap));obj->data = (int*)malloc(sizeof(int) * (k + 1));obj->szie = 0;obj->capacity = k + 1;return obj;
}/* 判断堆是否为空 */
bool isEmpty(PT_Heap obj) {return obj->szie == 0;
}/* 获得堆的当前大小 */
int getHeapSize(PT_Heap obj) {return obj->szie;
}/* 将元素入堆 */
void pushHeap(PT_Heap obj, int elem) {/* 新加入的元素放入堆的最后 */obj->data[++obj->szie] = elem;/* 对当前堆进行排序,使其成为一个大根堆 */swim(obj->data, obj->szie);
}/* 获得堆顶元素 */
int getHeapTop(PT_Heap obj) {return obj->data[1];
}/* 将堆顶元素出堆 */
int popHeap(PT_Heap obj) {/* 保存堆顶元素 */int top = obj->data[1];/* 将堆顶元素和堆底元素交换,同时堆长度减一 */swap(&obj->data[1], &obj->data[obj->szie--]);/* 将原先的堆底元素赋值为INT_MIN */obj->data[obj->szie + 1] = INT_MIN;/* 从堆顶开始重新堆化 */sink(obj->data, 1, obj->szie);return top;
}int findKthLargest(int* nums, int numsSize, int k){/* 初始化一个大小为k的堆 */PT_Heap heap = createHeap(k);/* 将输入数组前k个元素堆化 */for (int i = 0; i < k; i++) {pushHeap(heap, nums[i]);}/* 将输入数组剩下的元素依次插入小根堆,得出最大的k个数 */for (int i = k; i < numsSize; i++) {if (nums[i] > getHeapTop(heap)) {popHeap(heap);pushHeap(heap, nums[i]);}}/* 维护的是一个小根堆,堆顶元素即第K大的元素 */return popHeap(heap);
}
这里产生的问题:为什么维持k个元素的小根堆,再将k+1及之后的依次入堆,则堆顶元素就是第k大的?(原先堆底的元素上调,popHeap删掉了最小的k-1个,则堆顶就是第k大)(从小到大从大到小入堆不一样)
leetcode 215. 数组中的第 K个最 大的元素(堆排序,C语言)相关推荐
- ⭐算法入门⭐《哈希表》中等05 —— LeetCode 215. 数组中的第K个最大元素
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 给定整数数组nums和 ...
- 力扣(LeetCode)215. 数组中的第K个最大元素(C语言)
一.环境说明 本文是 LeetCode 215题 : 数组中的第K个最大元素,使用c语言实现. 快速选择.查找无序数组的利器! 测试环境:Visual Studio 2019. 二.代码展示 void ...
- vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素
题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/) 题目描述: 在未排序的数组中找到第 k 个最大的元素.请 ...
- LeetCode 215. 数组中的第K个最大元素(快速排序)
1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- LeetCode 215 数组中的第K个最大元素
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大 的元素,而不是第 k 个不同的元素. 题解 快速排序 代码 class Solution { pub ...
- leetcode 215.数组中的第K个最大元素
难度:中等 频率:250 ** 题目:给定整数数组nums和整数k,清返回数组中第K个最大的元素. 清注意你要找的是数组排序后的第K个最大的元素,而不是第K个不同的元素. ** ** 题目类型: 经典 ...
- Leetcode 215. 数组中的第K个最大元素 解题思路及C++实现
解题思路: 用最小堆来存储k个最大的值,遍历一次nums容器,然后返回最小堆中最上面节点的值即可. C++中使用priority_queue来实现最小堆.代码如下: class Solution { ...
- 2022-1-27 Leetcode 215.数组中的第 k 个最大元素
借助 STL class Solution {public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begi ...
- 【LeetCode】【HOT】215. 数组中的第K个最大元素(优先队列)
[LeetCode][HOT]215. 数组中的第K个最大元素 文章目录 [LeetCode][HOT]215. 数组中的第K个最大元素 package hot;import java.util.Co ...
最新文章
- Java版本多用户B2B2C商城源码-(八)消息总线(Spring Cloud Bus)
- DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值
- 【宝,我去读书了。读的什么书,给你的情书】《数据结构(c++)邓俊晖》-绪论篇
- kesioncms ajax分页,改进KesionCMS V9.0x SQL标签分页支持嵌套
- UVA10150 POJ2647 Doublets【BFS】
- 玩转计划任务命令:schtasks
- shell命令 安装软件包
- 前端开源项目周报0412
- 新浪微博API错误代码大全
- 数据结构——二叉树相关练习题
- Android修改浏览器书签和主页
- 【论文整理】风格迁移中格拉姆矩阵(Gram Matrix)的使用
- 计算机主机的跳线怎么接,手把手教你台式机电脑主板跳线接法
- Python第三方库资源
- 前端开发中,js时间与时间戳的转换
- .Net asp.net MVC 实现短信验证
- [架构之路-177]-《软考-系统分析师》-17-嵌入式系统分析与设计 -2- 系统分析与设计、低功耗设计
- opencv实现实时“无脸男”
- 基于Python的双目标MVS问题 课程报告+代码及数据
- MySQL:关于排序order by limit值不稳定的说明(1)
热门文章
- linux c 网络编程与信号量,linux网络编程-----线程同步--信号量
- epoll nio区别_高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?...
- java描述常用的集合类_Java常用的集合类
- ubuntu 无法启动mysql_解决ubuntu下安装mysql使用service 无法启动问题
- 计算机图形图像项目教程素材,案例任务驱动法在图形图像教学中的运用
- linux查看db2存储过程,DB2查看存储过程里SQL语句的执行情况
- 清空运行中的jar 日志_Java日志体系权威总结
- 《天天数学》连载46:二月十五日
- 大数据学习笔记35:Hive - 内部表与外部表
- 英语学习笔记2019-11-15