最近看到了 java.util.PriorityQueue
。剛看到還沒什麼感受,今天忽然發現他能夠用來找N個數中最小的K個數。html
假設有以下 10 個整數。java
5 2 0 1 4 8 6 9 7 3
怎麼找出最小的 5 個數呢?很好想到的方法是先升序排序,而後取前 5 個就能夠。web
至於怎麼排序方法有不少,好比簡單的冒泡,選擇,」難點」的有快速,希爾和堆等等。api
先看看這種比較少見的實現方法的代碼,再看看下面的簡單介紹。oracle
import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; public class FindSmallestKofNNumbers { public List<Integer> findSmallestKofNNumbers( int[] numbers, int k) { Queue<Integer> queue = new PriorityQueue<>(); for (int i : numbers) { queue.add(i); } List<Integer> ans = new ArrayList<>(); for (int i = 0; i < k; ++i) { ans.add(queue.poll());// 取k個數加到列表中 } return ans; } }
看完沒,代碼簡單吧,核心代碼就幾句。建立一個 PriorityQueue
對象,調用 add
方法和 poll
方法。svg
Integer
類型的一個基於優先級堆的無界優先級隊列。元素是按照隊列元素的天然順序進行排序。此隊列的頭是按指定方式肯定的最小的元素,若是多個元素都是最小值,則頭是其中一個元素——選擇方法任意。boolean add(E e)
將 e 插入此優先級隊列。E poll()
獲取並移除此隊列的頭,若是此隊列爲空,則返回 null
。import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class FindSmallestKofNNumbers { public List<Integer> findSmallestKofNNumbers( int[] numbers, int k) { int[] arr = Arrays.copyOf(numbers, numbers.length); Arrays.sort(arr); List<Integer> ans = new ArrayList<>(); for (int i = 0; i < k; ++i) { ans.add(arr[i]);// 取k個數加到列表中 } return ans; } }