《剑指offer》练习-面试题40-最小的k个数

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

思路:构造一个容量为k的容器,接下来每次从输入的n个整数中读入一个数。如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器中;若容器已满(已有k个数字了),则找出这已有的k个数中的最大值,然后拿这次待插入的整数与其比较。如果待插入的值比当前已有的最大值小,则替换;若待插入的值比当前已有的最大值大,则抛弃这个数。

https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf

package offer;

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Comparator;

public class Solution40 {

	public ArrayList GetLeastNumbers_Solution(int[] input, int k) {
		ArrayList result = new ArrayList();
		int length = input.length;
		if (k > length || k == 0) {
			return result;
		}

		PriorityQueue maxHeap = new PriorityQueue(k, new Comparator() {

			@Override
			public int compare(Integer o1, Integer o2) {
				return o2.compareTo(o1);
			}
		});
		for (int i = 0; i < length; i++) {
			if (maxHeap.size() != k) {
				maxHeap.offer(input[i]);
			} else if (maxHeap.peek() > input[i]) {
				Integer temp = maxHeap.poll();
				temp = null;
				maxHeap.offer(input[i]);
			}
		}
		for (Integer integer : maxHeap) {
			result.add(integer);
		}
		return result;
	}

	public static void main(String[] args) {
		Solution40 sl = new Solution40();
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入数组长度length=");
		int length = scanner.nextInt();
		System.out.print("请输入数组(以空格隔开):");
		int[] input = new int[length];
		for (int i = 0; i < length; i++) {
			input[i] = scanner.nextInt();
		}
		System.out.print("请输入需要求出的最小数个数k=");
		int k = scanner.nextInt();
		scanner.close();
		System.out.println("输出结果为:" + sl.GetLeastNumbers_Solution(input, k));

	}
}

 

你可能感兴趣的:(剑指offer刷题记录)