剑指 Offer 40. 最小的k个数

输入整数数组 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;
    }
}

方法二:

使用快速排序思想,这个还没有研究透,先不写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值