LeetCode[面试题17.14]最小的K个数

难度:中等

题目:

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 


 示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

  • 0 <= len(arr) <= 100000
  • 0 <= k <= min(100000, len(arr))

 Related Topics

  • 数组
  • 分治
  • 快速选择
  • 排序
  • 堆(优先队列)

重点!!!解题思路

第一步:

明确解题手段:此题比较简单的做法就是使用堆来解决,但是此章节我们练习的是排序算法,即此题我们采用排序算法来解决

第二步:

还是像排序算法 中使用模仿STL的快速排序思想,这里面我们就不需要使用插入排序了,直接使用手写的根据基准值快排即可(分区思想)

第三步:

分区之后,我们判断分区的大小和K的大小,不够或者超出就重新进行递归求解,正好相等那就返回结果 

源码+讲解:

    class Solution {public int[] smallestK(int[] arr, int k) {int[] ans=new int[k];  //创建一个结果集if (k==0) return ans;quick_sort(arr,0,arr.length-1,k);  //k不为0就进行递归求解for (int i=0;i<k;i++){  //将原数组的拷贝到结果集中ans[i]=arr[i];}return ans;}public int getmid(int a,int b,int c){  //取基准值int max=Math.max(a,Math.max(b,c));int min=Math.min(a,Math.max(b,c));if (a!=max && a!=min) return a;if (b!=max && b!=min) return b;return c;}public void swap(int[] arr,int i,int j){  交换数组值int t=arr[i];arr[i]=arr[j];arr[j]=t;}public void quick_sort(int[] arr,int l,int r,int k){if (l>=r) return;  //边界范围int i=l,j=r,m=getmid(arr[i],arr[j],arr[(i+j)/2]);  //拷贝边界+取基准值do {while (arr[i]<m) i++;while (arr[j]>m) j--;if (i<=j){  //此时arr[i]>arr[j] 要进行交换swap(arr,i,j);i++;  //交换后都进行移动j--;}}while (i<=j);  //边界范围if (j-l==k-1) return;  //j是已排序好的右边界 j-l为已排序号的数组大小if (j-l>=k){quick_sort(arr,l,j,k);  //超出即再从已知范围继续寻找k个数}else {quick_sort(arr,i,r,k-i+l);  //少了就从i开始到数组结尾找k-(j-l)-1个数,化简j+1=r 即最后化简为k-i+1}}}

运行结果:

 系列持续更新中,喜欢练习算法的那就点个攒吧  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15397.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源教育对话大模型 EduChat

文章目录 一、&#x1f680; 前言二、&#x1f916; 本地部署三、&#x1f468;‍&#x1f4bb; 使用示例四、&#x1f50e; 总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、&#x1f680; 前言 教育是一项对人类身心发展产生影响的社会实践…

磁盘与文件系统管理

磁盘结构及分区表示 硬盘 Hard Disk Drive &#xff0c;简称 HDD 是计算机常用的存储设备之一。 1 磁盘基础 1.1 硬盘的结构 1.1.1 数据结构 ①扇区&#xff1a;磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区&#xff0c;叫做引导…

easyupload

红框位置是上传后的提示 依次尝试上传&#xff0c;发现php,phtml.php3&#xff0c;php5&#xff0c;双写等都不行 .htaccess文件也不行 尝试.php. 绕过 (windows中会把后缀名最后的空格和. 省略&#xff0c;即上传.php.绕过后会变为.php) 加入图片头的php文件也不行 但是加入文…

100、基于STM32单片机自动跟随小车 红外遥控控制小车避障模式 跟随模式设计(程序+原理图+PCB源文件+流程图+硬件设计资料+元器件清单等)

绪 论 智能小车通过各种感应器获得外部环境信息和内部运动状态&#xff0c;实现在复杂环境背景下的自主运动&#xff0c;从而完成具有特定功能的机器人系统。而随着智能化电器时代的到来&#xff0c;它们在为人们提供的舒适的生活环境的同时&#xff0c;也提高了制造智能化电器…

Redis下载和安装(Windows系统)

本套教程中采用 Windows 系统对 Redis 数据库进行讲解。 虽然 Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过 GitHub 来下载 Windows 版 Redis 安装包&#xff0c;下载地址&#xff1a;点击前往。 注意&#xff1a;Windows 安装包是某位民间“大神”根据 …

关于antdesign-vue的layout组件样式失效问题(#components-layout-demo-custom-trigger)

1.错误描述 使用antdesign vue 中的layout作为主要布局&#xff0c;https://www.antdv.com/components/layout-cn 正常引入后&#xff0c;跟期望的样子不一样 期望中的样子 实际的样子 logo没有了&#xff0c;而且此时也无法更改样式。 此时的样式是这样的 无论怎么修改都…

vue路由

目录 Vue路由 Vue Router 使用流程&#xff1a; Vue路由 前端路由&#xff1a;由URL中的hash&#xff08;#号&#xff09;于组件之间的对应关系 Vue Router 介绍&#xff1a;Vue Router是Vue官方路由组成&#xff1a; VueRouter&#xff1a;路由器类&#xff0c;根据路由请…

【从0开始离线数仓项目】——新能源汽车数仓项目介绍

目录 1、数据仓库概念 2、项目需求及架构设计 3、集群资源规划设计 4、车辆日志字段说明 1、数据仓库概念 数据仓库&#xff08;Data Warehouse&#xff09;是为企业提供数据支持&#xff0c;用以协助企业制定决策、改进业务流程和提高产品质量等方面的工具。它可以接收多种…

C语言中一维数组及二维数组的运用

1、int arr[] {12,3,4,5,6}; int * p arr; int * q &arr[1]; 其中arr是数组名&#xff0c;代表了整个数组的首元素地址&#xff0c;这个是一个常量&#xff0c;放在常量存储区&#xff0c;所以在给int*p赋值的时候可以不用带&&#xff0c;而下面的arr[1]则代表数…

操作系统8:存储器的层次结构及程序的装入和链接

目录 1、存储器的层次结构 &#xff08;1&#xff09;多层结构的存储器系统 1.1 - 存储器的多层结构 1.2 - 可执行存储器 &#xff08;2&#xff09;主存储器与寄存器 2.1 - 主存储器 2.2 - 寄存器 &#xff08;3&#xff09;高速缓存和磁盘缓存 3.1 - 高速缓存 3.2 …

Tauri 提供界面 + 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

Tauri 提供界面 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令 文章目录 Tauri 提供界面 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令一、Tauri 概述二、界面预览三、代码参考1、main.rs2、App.vue3、Greet.vue4、依赖 一、Tauri 概述 Tauri 是一…

HummerRisk 配置 HTTPS访问

简介 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生的安全和治理问题。核心能力包括混合云的安全治理和云原生安全检测。 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密和身份验证来保护网络通信安全的协议。它…