题解 | #最小的K个数#
最小的K个数
http://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
import java.util.ArrayList; //实际就是使用堆排序,然后将前k个保存到list中。 public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> list = new ArrayList<>(); if(input.length<=0||input == null || input.length<k) return list; //第一步:从最后一个非叶子节点(input.length/2-1)开始,依次从后往前遍历调整, //生成一个大顶堆 for(int i = input.length/2-1;i>=0;i--){ adjustHeap(input, i, input.length); } //依次将堆中最后一个元素和堆顶交换,然后将剩余yuan调整成大顶堆,遍历一遍后排序完成 for(int j=input.length-1;j>0;j--){ swap(input,0,j); adjustHeap(input,0,j); } //list保存前k个数 for(int m=0;m<k;m++){ list.add(input[m]); } return list; } //调整大顶堆过程 public void adjustHeap(int[] input, int pos,int length){ int temp = input[pos]; //从pos的左孩子开始,每次都对左孩子操作 for(int k = 2*pos+1; k<length; k=2*k+1){ //左孩子和右孩子比较,如果右孩子大就移到右孩子上 if((k+1)<length && input[k]< input[k+1]){ k++; } //当前节点和父节点比较,大的值赋给父节点,同时移动到子节点上 if(input[k]>temp){ input[pos] = input[k]; pos = k; }else{ break; } } //将旧节点的值赋给新节点(和上面联系起来,相当于交换值) input[pos] = temp; } //交换方法 public void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }