問題描述:java
輸入n 個整數,輸出其中最小的k 個。數組
例如輸入8, 7, 6, 5, 4, 3, 2, 1這8 個數字,則最小的3 個數字爲3, 2, 1。spa
問題分析:code
時間複雜度O(nlogn)方法:排序
對n個整數升序排序,取數組前面k個數就是最小的k個數,時間複雜度爲O(nlogn),空間複雜度爲O(1)。rem
大頂堆,時間複雜度爲O(nlogk):get
咱們能夠採用大頂堆來保存最小的k個數,堆頂元素就是k個最小的數中最大的。新來一個元素的時候,與堆頂元素進行比較,若是比堆頂元素大,則直接丟棄。若是比堆頂元素小,則替換堆頂元素,而且進行大頂推的調整,須要O(logk)的時間。因此總的時間複雜度爲O(nlogk),空間複雜度爲O(k)。it
TreeSet,時間複雜度爲O(nlogk):io
TreeSet容器的內部結構一般由紅黑樹來實現,因此查找、刪除和插入操做都只須要O(logk)的時間。ast
代碼實現:
package oschina.IT100; /** * @project: oschina * @filename: IT5.java * @version: 0.10 * @author: JM Han * @date: 10:52 2015/11/2 * @comment: 輸入n 個整數,輸出其中最小的k 個。 * @comment: 例如輸入8, 7, 6, 5, 4, 3, 2, 1這8 個數字,則最小的3 個數字爲3, 2, 1。 * @result: */ import java.util.*; import static tool.util.*; public class IT5 { public static final int NUM = 3; public static void find3least(List<Integer> lst){ TreeSet<Integer> innerlst = new TreeSet<Integer>(); for (int i = 0; i < lst.size(); i++) { int x = lst.get(i); if(innerlst.size() < NUM) { innerlst.add(x); } else { int max = innerlst.last(); if(x < max){ innerlst.add(x); innerlst.remove(max); } } } if(innerlst.size() != 0){ printGenericIterator(innerlst.iterator()); } } public static void main(String[] args) { Integer[] testArray = new Integer[]{8, 7, 6, 5, 4, 3, 2, 1}; List<Integer> lst = Arrays.asList(testArray); Integer[] arra = lst.toArray(new Integer[0]); for(Integer i:arra) System.out.print(i+" "); System.out.println(); find3least(lst); } }
代碼輸出:
8 7 6 5 4 3 2 1 1 2 3