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);
}
}
40、最小的k个数
最新推荐文章于 2024-08-27 14:41:49 发布