40、最小的k个数

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> dui = new ArrayList<Integer>();
        if((input.length<=0)||(k<=0)||(k>input.length)) return dui;
        //此处只考虑k比input的length小的情况
        //构建最大堆,为方便坐标对齐,从坐标1开始计数
        dui.add(0);
        for(int i=1;i<k+1;i++)
        {
            int num = input[i-1];
            dui.add(num);
            int j = i;
            while((j>1)&&(num>dui.get(j/2)))
            {
                swap(dui,j/2,j);
                j = j/2;
            }
        }
        for(int i=k;i<input.length;i++)
        {
            //如果新增的数比最大堆的堆顶小,就删除堆顶,并将他插入最大堆
            if(input[i]<dui.get(1))
            {
                dui.remove(1);
                int num = input[i];
                dui.add(num);
                int j = k;
                while((j>1)&&(num>dui.get(j/2)))
                  {
                    swap(dui,j/2,j);
                    j = j/2;
                  }
            }
        }
        dui.remove(0);
        return dui;
    }
    public void swap(ArrayList<Integer> dui,int i1,int i2)
    {
        int temp = dui.get(i1);
        dui.set(i1,dui.get(i2));
        dui.set(i2,temp);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值