最小的K個數
阿新 • • 發佈:2020-08-13
最小的K個數
題目描述:
輸入整數陣列
arr
,找出其中最小的k
個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。
題目思路:
一、氣泡排序
排序方法太多了,從小到大排序,然後取前K個值。
public int[] getLeastNumbers(int[] arr, int k) { int[] res = new int[k]; //排序以後取K個 for (int i = 0; i < arr.length; i++) { for (int j = i+1; j < arr.length ; j++) { if (arr[i] > arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } System.arraycopy(arr,0,res,0,k); return res; }
二、堆
堆的數量為k
依次入堆,當堆滿時就彈出最大的數字
剩下的就是最小的k個數
if (k == 0){ return new int[0]; } // 使用一個大頂堆 // java的priorityQueue預設是小頂堆,新增comparator引數使其變成最大堆 Queue<Integer> heap = new PriorityQueue<>((o1, o2) -> Integer.compare(o2, o1)); for (int e : arr) { // 當前元素小於堆頂元素才會入堆 if (heap.isEmpty() || heap.size() < k || e < heap.peek()){ heap.offer(e); } if (heap.size() > k){ // 刪除堆頂最大元素 heap.poll(); } } // 將堆中的元素存入陣列 int[] res = new int[heap.size()]; int j = 0; for (int e : heap) { res[j++] = e; } return res;