题解 | #最小的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;
    }
}
全部评论
{4,8,7,6,2,1,3,5} 这个有问题,你试试。
点赞 回复 分享
发布于 2022-04-22 11:00
算法是对的,就一行代码写的有点问题
点赞 回复 分享
发布于 2022-04-22 11:01

相关推荐

点赞 评论 收藏
分享
无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务