29. 最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解题思路
- 常规解法:各种排序算法
- 创建一个大小为k的数组,遍历n个整数,如果遍历到的数小于大小为k的数组的最大值,则将此数与其最大值替换。
- 在2思路的基础上,用小根堆求解
** 代码实现**
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if (input == null) {
return null;
}
if (k > input.length) {
return new ArrayList<Integer>();
}
int max = 999;
int length = input.length;
ArrayList<Integer> output = new ArrayList<>();
for (int i = 0; i < k; i++, length--){
AdjustMinTree(input); // 调整为小根堆
output.add(input[0]);
input[0] = input[length-1];
input[length-1] = max;
}
return output;
}
//调整小根堆
public void AdjustMinTree(int[] tree) {
int pNode = (tree.length/2)-1;
for (;pNode >= 0; pNode--) {
int left = 2*pNode + 1;
int right = 2*pNode + 2;
// 左孩子小于根节点
if (left < tree.length && tree[left] < tree[pNode]){
int tmp = tree[pNode];
tree[pNode] = tree[left];
tree[left] = tmp;
//System.out.println(tree[pNode]+" < "+tree[left] );
}
// 右孩子小于根节点
if (right <tree.length && tree[right] < tree[pNode]){
int tmp = tree[pNode];
tree[pNode] = tree[right];
tree[right] = tmp;
//System.out.println(tree[pNode]+" < "+tree[right] );
}
}
}
}