剑指offer-最小的k个数
Posted zhacai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-最小的k个数相关的知识,希望对你有一定的参考价值。
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
最下topk,使用大顶堆
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) ArrayList<Integer> re = new ArrayList<Integer>(); if(input == null || input.length<k ||k==0)//判断非法 return re; int[] heap = new int[k];//new一个堆空间 for(int i=0;i<k;i++) heap[i] = input[i]; for(int i = k/2;i>=0;i--)//调整大顶堆 adjustHeap(heap,i,k-1); for(int i = k;i<input.length;i++)//对第k个以后的数,如果小于堆顶元素就和堆顶替换,否则不进行任何操作 if(input[i]<heap[0]) heap[0] = input[i]; adjustHeap(heap,0,k-1); for(int i = 0;i<k;i++) re.add(heap[i]); return re; public void adjustHeap(int[] heap,int left ,int right)//调整大顶堆 int target = heap[left]; for(int i=left*2+1;i<=right;i=i*2+1) if(i<right&&heap[i]<heap[i+1]) i++; if(heap[i]<=target) break; heap[left] = heap[i]; left =i; heap[left] =target;
以上是关于剑指offer-最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章