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

分治-快排-面试题 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.xdnf.cn/news/17383.html

相关文章:

  • 在 Vue 中动态引入SVG图标的实现方案
  • Horse3D引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形
  • 第十九天-输入捕获实验
  • Redis面试题及详细答案100道(01-15) --- 基础认知篇
  • synchronized和RentrantLock用哪个?
  • LangChain-Unstructured 基础使用:PDF 与 Markdown 处理解析
  • 深入解析进程创建与终止机制
  • RAG-大模型课程《李宏毅 2025》作业1笔记
  • 算法篇----分治(快排)
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:General Purpose I/O (GPIO)通用输入 / 输出,LED控制亮灭,按键控制,中断控制
  • 【Mac】MLX:Lora微调工作流
  • 疯狂星期四文案网第34天运营日记
  • 第15届蓝桥杯Scratch图形化省赛中级组2024年8月24日真题
  • C++四种类型转换
  • 决策树技术详解:从理论到Python实战
  • 数据标准化与归一化的区别与应用场景
  • UE蓝图节点Add Impulse和Add Torque in Radians
  • Solana上Launchpad混战:新颖性应被重视
  • [激光原理与应用-201]:光学器件 - 增益晶体 - 概述
  • 大语言模型提示工程与应用:LLMs文本生成与数据标注实践
  • Java基础-TCP通信(多发多收和一发一收)
  • PHP-单引号和双引号(通俗易懂讲解版)
  • MySQL 元数据详细说明
  • AI基础与实践专题:神经网络基础
  • 探索Trae:使用Trae CN爬取 Gitbook 电子书
  • Java 8 特性
  • 网络管理实战
  • 【QT】常⽤控件详解(六)多元素控件 QListWidget Table Widget Tree Widget
  • QT第三讲- 机制、宏、类库模块
  • MBR分区nvme固态硬盘安装win7--非UEFI启动和GPT分区