1. 程式人生 > >劍指offer-29:最小的K個數

劍指offer-29:最小的K個數

題目描述

輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

思路

基本上就是一個排序的演算法,找出最小的k個數,這裡用的是堆排序,O(n)比其他的排序方法小

程式碼

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

/**
 *題目描述
 * 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
 */
public class Solution29 { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> result = new ArrayList<>(); int length = input.length; if(k > length || k == 0){ return result; } //底層基於二叉堆實現
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k, Comparator.reverseOrder()); for (int anInput : input) { if (maxHeap.size() != k) { maxHeap.offer(anInput); } else if (maxHeap.peek() > anInput) { maxHeap.poll
(); maxHeap.offer(anInput); } } result.addAll(maxHeap); return result; } public static void main(String[] args) { int arr[]={4,5,1,6,2,7,3,8}; BeanUtil.printArr(new Solution29().GetLeastNumbers_Solution(arr,3)); } }