数组排序后的第 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语言)相关推荐

  1. ⭐算法入门⭐《哈希表》中等05 —— LeetCode 215. 数组中的第K个最大元素

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给定整数数组nums和 ...

  2. 力扣(LeetCode)215. 数组中的第K个最大元素(C语言)

    一.环境说明 本文是 LeetCode 215题 : 数组中的第K个最大元素,使用c语言实现. 快速选择.查找无序数组的利器! 测试环境:Visual Studio 2019. 二.代码展示 void ...

  3. vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素

    题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/) 题目描述: 在未排序的数组中找到第 k 个最大的元素.请 ...

  4. LeetCode 215. 数组中的第K个最大元素(快速排序)

    1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

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

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大 的元素,而不是第 k 个不同的元素. 题解 快速排序 代码 class Solution { pub ...

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

    难度:中等 频率:250 ** 题目:给定整数数组nums和整数k,清返回数组中第K个最大的元素. 清注意你要找的是数组排序后的第K个最大的元素,而不是第K个不同的元素. ** ** 题目类型: 经典 ...

  7. Leetcode 215. 数组中的第K个最大元素 解题思路及C++实现

    解题思路: 用最小堆来存储k个最大的值,遍历一次nums容器,然后返回最小堆中最上面节点的值即可. C++中使用priority_queue来实现最小堆.代码如下: class Solution { ...

  8. 2022-1-27 Leetcode 215.数组中的第 k 个最大元素

    借助 STL class Solution {public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begi ...

  9. 【LeetCode】【HOT】215. 数组中的第K个最大元素(优先队列)

    [LeetCode][HOT]215. 数组中的第K个最大元素 文章目录 [LeetCode][HOT]215. 数组中的第K个最大元素 package hot;import java.util.Co ...

最新文章

  1. Java版本多用户B2B2C商城源码-(八)消息总线(Spring Cloud Bus)
  2. DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值
  3. 【宝,我去读书了。读的什么书,给你的情书】《数据结构(c++)邓俊晖》-绪论篇
  4. kesioncms ajax分页,改进KesionCMS V9.0x SQL标签分页支持嵌套
  5. UVA10150 POJ2647 Doublets【BFS】
  6. 玩转计划任务命令:schtasks
  7. shell命令 安装软件包
  8. 前端开源项目周报0412
  9. 新浪微博API错误代码大全
  10. 数据结构——二叉树相关练习题
  11. Android修改浏览器书签和主页
  12. 【论文整理】风格迁移中格拉姆矩阵(Gram Matrix)的使用
  13. 计算机主机的跳线怎么接,手把手教你台式机电脑主板跳线接法
  14. Python第三方库资源
  15. 前端开发中,js时间与时间戳的转换
  16. .Net asp.net MVC 实现短信验证
  17. [架构之路-177]-《软考-系统分析师》-17-嵌入式系统分析与设计 -2- 系统分析与设计、低功耗设计
  18. opencv实现实时“无脸男”
  19. 基于Python的双目标MVS问题 课程报告+代码及数据
  20. MySQL:关于排序order by limit值不稳定的说明(1)

热门文章

  1. linux c 网络编程与信号量,linux网络编程-----线程同步--信号量
  2. epoll nio区别_高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?...
  3. java描述常用的集合类_Java常用的集合类
  4. ubuntu 无法启动mysql_解决ubuntu下安装mysql使用service 无法启动问题
  5. 计算机图形图像项目教程素材,案例任务驱动法在图形图像教学中的运用
  6. linux查看db2存储过程,DB2查看存储过程里SQL语句的执行情况
  7. 清空运行中的jar 日志_Java日志体系权威总结
  8. 《天天数学》连载46:二月十五日
  9. 大数据学习笔记35:Hive - 内部表与外部表
  10. 英语学习笔记2019-11-15