第 17 日: 最小的k个数
题目链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
题目
解题
-
排序
解题思路:
看到这种题,最容易想到的就是排序,然后把它的前k项取出来。详细代码如下:
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
Arrays.sort(arr);
return Arrays.copyOf(arr,k);
}
}
-
基于快速排序的数组划分
解题思路:
使用过快速排序的小伙伴,都知道快排采用的是分而治之的思想,也就是把小于指定值分到左边,大于指定值的分到右边。
回到这一题是寻找最小值的前k项,也就是说我们直接通过快排切分排好第 K 小的数(下标为 K-1),那么它左边的数就是比它小的另外 K-1 个数啦详细代码如下:
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
quickSort(arr,0,arr.length-1,k-1);
return Arrays.copyOf(arr,k);
}
public void quickSort(int[] nums,int left,int right,int h){
int l=left,r=right;
int midv=nums[l+(r-l)/2];
int temp=-1;
while(l<r){
while(nums[l]<midv) l++;
while(nums[r]>midv) r--;
if(l>=r) break;
//交换
temp=nums[l];
nums[l]=nums[r];
nums[r]=temp;
if(nums[l]==midv) r--;
if(nums[r]==midv) l++;
}
//防止溢出
if(l==r){
l++;
r--;
}
if(h<r){
if(left<r) quickSort(nums,left,r,h);
}else if(h>=l){
if(l<right) quickSort(nums,l,right,h);
}else {
return;
}
}
}