每天一道劍指offer-最小的K個數

  • 2019 年 10 月 4 日
  • 筆記

前言

今天的題目 每天的題目見github(看最新的日期): https://github.com/gzc426 具體的題目可以去牛客網對應專題去找。

昨天的題解

題目

每天一道劍指offer-最小的K個數 來源: https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

題目詳述

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

題目詳解

思路

  • 使用一個大小為K的最大堆,然後堆裡面最大的數是堆頂,然後每次比較堆頂的數和數組中的數,如果堆頂的數比數組中的數A大,那麼就把堆頂的數彈出來,把數組中的數A進堆,這樣子到最後堆裡面的堆頂始終是比外面的數小,而堆里的其他數是小於堆頂的數(最大堆的性質),所以堆中的數就是最小的k個數

程式碼

import java.util.*;  public class Solution {      public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {          ArrayList<Integer> resultList = new ArrayList<>();          if(k > input.length || k<=0)              return resultList;          //使用優先順序隊列建堆,優先順序隊列默認是最小堆,所以要重寫比較器          PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>(){              public int compare(Integer o1,Integer o2){                  return o2.compareTo(o1);              }          }          );          for(int i=0;i<input.length;i++)          {              if(i < k){//如果沒有達到k個數,那麼直接入堆                  maxHeap.add(input[i]);              }else{                  if(maxHeap.peek() > input[i])                  {//堆頂的數比數組當前的數大,那麼就堆頂出堆                      maxHeap.poll();                      maxHeap.add(input[i]);//把當前數加入堆中                  }              }          }          while(maxHeap.isEmpty() != true)              resultList.add(maxHeap.poll());//把堆中的數出堆添加到結果數組中          return resultList;      }  }

程式碼截圖(避免亂碼)

Tags: