Leetcode:剑指offer40:最小的k个数
快排的时间复杂度为O(nlogn)~O(n),是最快的排序算法,所以找到最小的k个数又不要求顺序的话,快排每次递归以基准值分割是个不缺的想法。
所以可以进行快速排序,当找到基准值的下标是k的时候,说明基准值前面有k个待排序数组中的小的数。
直接把前面的k个数当成子数组输出即可。
public class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
int[] res = new int[k];
int length=arr.length;
if(arr.length==0 || k==0){
return new int[0];
}
res=quickSort(arr,0,length-1,k-1);
return res;
}
public int[] quickSort(int[] arr,int low,int high,int k){
int middle=findMid(arr,low,high);
//当基准值的下标与k个数的下标相等时,把分割好的前面k个无序比基准值小的子数组复制并return
if(middle==k){
return Arrays.copyOf(arr,k+1);
}
return middle>k?quickSort(arr,low,middle-1,k):quickSort(arr,middle+1,high,k);
}
public int findMid(int[] arr,int low,int high){
int flag=arr[low];
while(low<high){
while(low<high && arr[high]>flag){
high--;
}
arr[low]=arr[high];
while(low<high && arr[low]<=flag){
low++;
}
arr[high]=arr[low];
}
arr[low]=flag;
return low;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律