题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
1. sort排序
import java.util.*;
public class Solution {
static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
Arrays.sort(input);
ArrayList<Integer> list=new ArrayList<>();
int i=0;
if(input.length<k)return list;
while(i<k){
list.add(input[i]);
i++;
}
return list;
}
}
2. 优先队列
import java.util.*;
public class Solution {
static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
PriorityQueue<Integer> pq=new PriorityQueue<>();
for(int i:input)pq.add(i);
ArrayList<Integer> list=new ArrayList<>();
if(input.length<k)return list; //空
for(int i=0;i<k;i++){
list.add(pq.poll());
}
return list;
}
}
3. 快速排序
快排的partition函数会将原序列分为左右两个子序列,左边序列都小于pivot,右边序列都大于或等于pivot,当pivot为数组的第k个元素时,数组中pivot及其之前的元素都小于右边序列,即为n个整数中最小的k个数。
import java.util.*;
public class Solution {
ArrayList<Integer> list=new ArrayList<>();
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//实际上是快排的变形
if(k>input.length)return list; //特殊情况
minK(input,0,input.length-1,k);
for(int i=0;i<k;i++)list.add(input[i]);
return list;
}
public void minK(int[] input,int left,int right,int k){
if(left<right){
int pos=Partition(input,left,right);
int M=pos-left+1;
if(k==M)return;
if(k<M)minK(input,left,pos-1,k); //向左
else minK(input,pos+1,right,k-M); //向右
}
}
public int Partition(int[] array,int left,int right){
int temp=array[left];
while(left<right){
while(left<right&&array[right]>temp)right--;
array[left]=array[right];
while(left<right&&array[left]<=temp)left++;
array[right]=array[left];
}
array[left]=temp;
return left;
}
}