题解 | #最小的K个数#|建堆的方法,拙劣模仿与注释
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
/** 注释基于自己理解,如果有问题谢谢指正 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param input int整型一维数组 * @param inputLen int input数组长度 * @param k int整型 * @return int整型一维数组 * @return int* returnSize 返回数组行数 */ //虽然一眼排序取前k个,但是还是用堆做 //建一个大根堆 void buildmaxheap(int*p,int father,int len) { int son=2*father+1;//大根堆左孩子坐标 if(son>=len) return;//比大根堆规模大了就不可以了 if(son+1<len&&p[son+1]>p[son]) son++;//建堆 if(p[son]<=p[father]) return;//孩子不能比父亲大 //如果大了就需要调整父亲位置,然后因为父亲变化,所以调用自己接着建 else { int temp; temp=p[son]; p[son]=p[father]; p[father]=temp; father=son; buildmaxheap(p,father,len); } } // void maxheap(int *p,int len,int k) { //建第一个堆 if(len<=k) return; int i=(k-1)/2;//这是父亲 for(;i>=0;i--) { buildmaxheap(p,i,k); } i=k; //第一个堆建完了,接下来开始移动 for(;i<len;i++) { //如果后面的数字比堆顶小,那么就替换堆顶并对这个堆重建 if(p[i]<p[0]) { int temp; temp=p[i]; p[i]=p[0]; p[0]=temp; buildmaxheap(p,0,k); } } } int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) { // write code here //首先看看规模大小 if(inputLen<=1) { *returnSize=inputLen; return input; } //比1大就正常建堆 maxheap(input, inputLen,k); *returnSize=k;//堆规模 return input;//输出最小的k个数 }