IT公司100題-5-查找最小的k個元素

問題描述: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
相關文章
相關標籤/搜索