输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
1.常规解法
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
Arrays.sort(arr);
int len=arr.length;
int[] a=new int[k];
int t=0;
for(int i=0;i<k;i++)
{
a[t++]=arr[i];
}
return a;
}
}
2.快速排序法
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
quickSort(arr,0,arr.length-1);
return Arrays.copyOf(arr,k);
}
public void quickSort(int[] arr,int low,int high){
if(low>=high)return;
int pivotPos=partition(arr,low,high);
quickSort(arr,low,pivotPos-1);
quickSort(arr,pivotPos+1,high);
}
int partition(int[] arr,int low,int high){
int pivot=arr[low];
while(low<high)
{
while(low<high&&arr[high]>=pivot)high--;
arr[low]=arr[high];
while(low<high&&arr[low]<=pivot)low++;
arr[high]=arr[low];
}
arr[low]=pivot;
return low;
}
}
3.小根堆排序
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
PriorityQueue<Integer> minHeap=new PriorityQueue<>();//默认小根堆,需要用大根堆时要实现Comparator接口
for (int i = 0; i < arr.length; i++) {
minHeap.offer(arr[i]);
}
int[] res=new int[k];
for (int i=0;i<k;i++)
{
res[i]=minHeap.poll();
}
return res;
}
}