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

分治-快排-面试题 17.14.最小k个数-力扣(LeetCode)

一、题目解析

1、返回k个最小数

2、可以任意顺序

二、算法原理

解法1:排序 O(N*logN)

直接排序数组,然后用迭代器初始化构造一个匿名对象

解法2:大根堆 O(N*logk)

构造一个大根堆,依次插入元素,控制容器大小为k,超过k的部分pop掉,最后大根堆中存储的就是k个最小的元素,插入到vector中

解法3:快排

随机基准元素+数组分三块

详细见该篇文章分治-快排-215.数组中的第k个最大元素-力扣(LeetCode)-CSDN博客

根据三块区域元素个数分情况讨论

三、代码示例

解法1:

 //解法1:排序vector<int> smallestK(vector<int>& arr, int k){sort(arr.begin(),arr.end());return {arr.begin(),arr.begin()+k};}

解法2:

//解法2:大根堆vector<int> smallestK(vector<int>& arr, int k){if(k == 0 || arr.empty()) return {};priority_queue<int> pq;for(auto e : arr){pq.push(e);if(pq.size()>k) pq.pop();}vector<int> ret;while(k--){ret.push_back(pq.top());pq.pop();}return ret;}

解法3:

//解法3:快排vector<int> smallestK(vector<int>& arr, int k){srand(time(NULL));if(k==0 || arr.empty()) return {};qsort(arr,k,0,arr.size()-1);return {arr.begin(),arr.begin()+k};}void qsort(vector<int>& arr,int k,int l,int r){if(l>=r) return;int key = getRandom(arr,l,r);//随机选择基准元素int left = l-1,right = r+1,i = l;//数组分三块while(i<right){if(arr[i]<key) swap(arr[++left],arr[i++]);else if(arr[i] == key) i++;else swap(arr[i],arr[--right]);}int a = left - l +1,b = right - left - 1;//分情况讨论if(a>k) qsort(arr,k,l,left);else if(a+b>=k) return;else qsort(arr,k-a-b,right,r);}int getRandom(vector<int>& arr,int left,int right){return arr[rand() % (right-left+1) + left];}

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

http://www.dtcms.com/a/322809.html

相关文章:

  • Redhat Linux 9.6 配置本地 yum 源
  • 【数据结构入门】栈和队列
  • 网盘短剧资源转存项目源码 支持垮克 带后台 附教程
  • Kafka服务端NIO操作原理解析(二)
  • MX 播放器:安卓设备上的全能视频播放器
  • 【解决方法】华为电脑的亮度调节失灵
  • 本地部署接入 whisper + ollama qwen3:14b 总结字幕
  • 服务机器人选择屏幕的逻辑
  • 微软推出革命性AI安全工具Project IRE,重塑网络安全防御新范式
  • Orange的运维学习日记--37.iSCSI详解与服务部署
  • FreeRTOS学习笔记:任务通知和软件定时器
  • jQuery 零基础学习第一天
  • 数据结构—二叉树及gdb的应用
  • 【贪心】P4873 [USACO14DEC] Cow Jog G|省选-
  • MBR分区nvme固态硬盘安装win7--非UEFI启动和GPT分区
  • llm本地部署+web访问+交互
  • Oracle字段操作
  • [TryHackMe]Challenges---Game Zone游戏区
  • 力扣热题100-----118.杨辉三角
  • Kettle ETL 工具存在的问题以及替代方案的探索
  • Arm Development Studio 安全通告:CVE-2025-7427
  • 什么情况下需要JVM调优?
  • Java-file类
  • 力扣 30 天 JavaScript 挑战 第二题笔记
  • 每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min
  • 【攻防实战】从外到内全链路攻防实战纪实
  • python---类型别名
  • 1073. 沙漏
  • sqli-labs通关笔记-第40关 GET字符型堆叠注入(单引号括号闭合 手工注入+脚本注入两种方法)
  • J2000平赤道系、瞬时平赤道系与瞬时真赤道系