输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
思路:
使用堆解决这个问题,输出k个小的,那么就建立一个k个大小的最大堆,因为最大堆的性质就是堆里面的元素都比堆顶小,所以拿着剩下的.length (数组的长度用length获取没有 () 注意)来 进行比较,如果这个值比堆顶小,那么就把这个值,加到堆顶上,然后进行下滑操作。
注意点:在下滑的时候,一定要注意,在执行完一轮之后,要把i重新赋值,因为如果进行了交换,新的temp位置,可能是不平衡的,所以要把i赋值为temp,然后在进行判断。非常重要的一点 这里在自己写的时候给忘记了,。。。。。
class Solution {
int []res;
public int[] getLeastNumbers(int[] arr, int k) {
res=new int[k];
if(k==0){
return res;
}
for(int i=0;i<k;i++){
res[i]=arr[i];
}
for(int i=k/2-1;i>=0;i--){
bulidheap(i,k);
}
//数组的长度 size
for(int i=k;i<arr.length;i++){
if(res[0]>=arr[i])
{
res[0]=arr[i];
bulidheap(0,k);
}
}
return res;
}
public void bulidheap(int i,int k){
int temp=i;
while(true){
if(2*i+1<k&&res[i]<res[2*i+1])
temp=2*i+1;
if(2*i+2<k&&res[temp]<res[2*i+2])
temp=2*i+2;
if(i==temp){
break;
}
swap(i,temp);
i=temp;
}
}
public void swap(int x,int y){
int temp=res[x];
res[x]=res[y];
res[y]=temp;
}
}
方法二:
使用快速排序思想,这个还没有研究透,先不写了
。