题目描述:
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
思想描述:
先排序,再选出最小的k个数
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//采用大根堆或是冒泡排序
ArrayList<Integer> arr = new ArrayList<Integer>();
//int length = input.length;
if(input.length ==0 || k>input.length){
return arr;
}
//首先建立一个小根堆
for(int i=(input.length-2)/2; i>=0; i--){
SmallHeap(input,i,input.length);
}
for(int j=input.length-1; j>=input.length-k; j--){
swap(input,0,j);
arr.add(input[j]);
SmallHeap(input,0,j);
}
return arr;
}
public void SmallHeap(int [] input, int i,int length){
if(i > (length-2)/2 || length ==1)
return ;
int left = 2*i+1, right = 2*i+2;
int least=left;
if(right<length && input[right]<input[left]){
\\if语句中判断条件不可调换,否则会出现数组越界
\\如果调换,则会出现right=length
least = right;
}
if(input[least]<input[i]){
swap(input,i,least);
SmallHeap(input, least, length);
}
}
public void swap(int[] input, int i, int j){
int t;
t = input[i];
input[i]=input[j];
input[j]=t;
}
}