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

215. 数组中的第 K 个最大元素(C 语言解法 + 面试思路解析)

题目描述

给定一个整数数组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 <= 10^5

  • -10^4 <= nums[i] <= 10^4


解题思路

方法一:快速选择(QuickSelect)

快速选择是快排的一种变体,只需要递归处理一边数组就可以找到第 k 大元素。

核心思路:
  1. 转化为第 n-k 小元素
    第 k 大元素 = 第(numsSize - k)小元素(升序序号)。

  2. partition 函数

    • 随机选 pivot,交换到末尾

    • 遍历数组,小于 pivot 的放左边,大于 pivot 的放右边

    • 返回 pivot 最终位置

  3. 递归查找

    • 如果 pivot 位置 = k_smallest,返回

    • 否则递归左/右子数组

C 语言实现
#include <stdlib.h> // 交换函数 void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } // partition:返回 pivot 最终位置 int partition(int* nums, int left, int right) { int pivotIndex = left + rand() % (right - left + 1); swap(&nums[pivotIndex], &nums[right]); int pivot = nums[right]; int i = left; for (int j = left; j < right; j++) { if (nums[j] < pivot) { swap(&nums[i], &nums[j]); i++; } } swap(&nums[i], &nums[right]); return i; } int quickSelect(int* nums, int left, int right, int k_smallest) { if (left == right) return nums[left]; int pivotIndex = partition(nums, left, right); if (pivotIndex == k_smallest) return nums[pivotIndex]; else if (pivotIndex > k_smallest) return quickSelect(nums, left, pivotIndex - 1, k_smallest); else return quickSelect(nums, pivotIndex + 1, right, k_smallest); } int findKthLargest(int* nums, int numsSize, int k) { return quickSelect(nums, 0, numsSize - 1, numsSize - k); }
复杂度分析
  • 时间复杂度:平均 O(n)

  • 空间复杂度:O(1)(原地修改数组)

  • 优点:最优解法,适合面试

  • 缺点:最坏情况 O(n²),需随机化 pivot


方法二:最小堆(优先队列思想)

如果 k 比较小,可以用大小为 k 的最小堆,保持堆顶始终是第 k 大元素。

核心思路:
  1. 建立大小为 k 的最小堆

  2. 遍历数组元素:

    • 堆没满:直接放入

    • 堆满:如果元素大于堆顶,替换并下沉

  3. 最终堆顶即为第 k 大元素

C 语言实现
#include <stdlib.h> void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } void heapifyUp(int* heap, int index) { while (index > 0) { int parent = (index - 1) / 2; if (heap[parent] <= heap[index]) break; swap(&heap[parent], &heap[index]); index = parent; } } void heapifyDown(int* heap, int size, int index) { while (1) { int smallest = index; int left = 2*index + 1; int right = 2*index + 2; if (left < size && heap[left] < heap[smallest]) smallest = left; if (right < size && heap[right] < size && heap[right] < heap[smallest]) smallest = right; if (smallest == index) break; swap(&heap[index], &heap[smallest]); index = smallest; } } int findKthLargest(int* nums, int numsSize, int k) { int* heap = (int*)malloc(sizeof(int) * k); int heapSize = 0; for (int i = 0; i < numsSize; i++) { if (heapSize < k) { heap[heapSize] = nums[i]; heapifyUp(heap, heapSize); heapSize++; } else if (nums[i] > heap[0]) { heap[0] = nums[i]; heapifyDown(heap, heapSize, 0); } } int result = heap[0]; free(heap); return result; }
复杂度分析
  • 时间复杂度:O(n log k)

  • 空间复杂度:O(k)

  • 适用场景

    • 流式数据

    • k 很小

    • 不允许修改原数组


总结

方法时间空间备注
快速选择平均 O(n)O(1)面试最优解
最小堆O(n log k)O(k)流式或 k 小

面试小贴士:

  1. 第 k 大 = 第 n-k 小

  2. 随机化 pivot 避免最坏情况

  3. 堆解法更稳、适合流式数据


http://www.jsqmd.com/news/616635/

相关文章:

  • 合法获取付费内容的创新方法
  • OpenClaw替代方案:当Kimi-VL-A3B-Thinking不可用时的应急处理
  • 第六章:异步访问的同步:6.3.1 dma_resv_usage 层级机制详解
  • 【LeetCode 53】最大子数组和(Maximum Subarray)题解
  • Youtu-Parsing开源文档解析模型详解:像素级定位+RAG就绪JSON/Markdown输出
  • Ostrakon-VL-8B入门:Anaconda创建独立Python环境避免依赖冲突
  • YOLOv12官版镜像实战:手把手教你验证COCO数据集,小白也能轻松上手
  • OpenClaw配置文件详解:对接百川2-13B-4bits量化模型的最佳实践
  • Qwen3-ASR-0.6B部署案例:广电媒体素材库语音元数据自动打标系统
  • 手把手教你用Phi-4-mini-reasoning搭建智能解题助手:从部署到实战
  • OpenClaw配置备份:千问3.5-9B模型切换无忧方案
  • SecGPT-14B效果展示:对Splunk SPL查询语句进行安全语义解释与优化建议
  • SiameseAOE模型效果深度评测:多领域文本抽取能力对比
  • LeetCode 207|课程表(Course Schedule)题解 – 拓扑排序判环法
  • Qwen3.5-2B部署教程:WSL2环境下Windows用户一键运行图文模型
  • VSCode下载与配置Starry Night Art Gallery开发环境
  • C++易搞混知识: 指针、引用与取地址运算符对比分析
  • 专家答辩:视频不再是监控:基于三维空间智能体的空间计算系统构建与应用
  • Qwen3-Embedding-4B新手指南:可视化界面,轻松玩转文本向量化
  • OpenClaw技能市场指南:为千问3.5-9B寻找合适的功能扩展
  • LeetCode 210 课程表 II | 拓扑排序详解(C语言实现)
  • Swoole 5.0适配踩坑实录,深度解析协程生命周期变更、内存管理新规与RPC协议不兼容问题
  • OpenClaw+Qwen3-14B内容工厂:自动生成技术博客与SEO优化
  • VibeVoice实时语音合成实战:25种音色一键切换,打造多语言语音助手
  • nanobot超轻量级AI助手部署实测:快速体验Qwen3-4B模型的智能回复
  • [具身智能-314]:大语言模型处理文本的全过程
  • 镜像视界VS 专家 :空间计算系统最刁钻10问 + 答案
  • 一键部署实时口罩检测-通用:基于Gradio的交互式Web界面快速上手
  • Lychee-Rerank安全加固指南:防止注入攻击与数据泄露
  • Fish-speech-1.5多语言支持实战:13种语言的语音合成技巧