思路一:
注意找前 k 大/前 k 小問題不需要對整個陣列進行 o(nlogn)o(nlogn) 的排序!
例如本題,直接通過快排切分排好第 k 小的數(下標為 k-1),那麼它左邊的數就是比它小的另外 k-1 個數啦
思路二(容易理解一點):
利用大頂堆
思路一:
class
solution
// 最後乙個引數表示我們要找的是下標為k-1的數
return
quicksearch
(arr,
0, arr.length -
1, k -1)
;}private
int[
]quicksearch
(int
nums,
int lo,
int hi,
int k)
// 否則根據下標j與k的大小關係來決定繼續切分左段還是右段。
return j > k?
quicksearch
(nums, lo, j -
1, k)
:quicksearch
(nums, j +
1, hi, k);}
// 快排切分,返回下標j,使得比nums[j]小的數都在j的左邊,比nums[j]大的數都在j的右邊。
private
intpartition
(int
nums,
int low,
int high)
while
(nums[i]
<=temp&&iif(i}//兩指標重合後:交換基準
nums[low]
=nums[i]
; nums[i]
=temp;
return j;
}}
思路二:
class
solution;}
priorityqueue
<
integer
>
maxheap=
newpriorityqueue
<
>(3
,(integer a,
integer b)
->);
maxheap.
add(arr[0]
);for(
int i=
1;i)else}}
int[
] res=
newint
[k];
int size=maxheap.
size()
;for
(int i=
0;i)return res;
}}
劍指offer40 最小的k個數
輸入n個整數,找出其中最小的k個數。注意 資料保證k一定小於等於輸入陣列的長度 輸出陣列內元素請按從小到大順序排序 樣例 輸入 1,2,3,4,5,6,7,8 k 4 輸出 1,2,3,4 思路1 用大頂堆儲存k個數,然後不斷的遍歷陣列,若是陣列中的數小於堆頂元素,則替換。實踐複雜度為o nlogk...
劍指offer40 最小的 K 個數
題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 方法一 維護乙個大小為k的大頂堆,複雜度 o nlogk o k 特別適合處理海量資料 public class solution priorityqueuemax...
劍指offer40 最小的k個數
問題描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法1 o nlogn def getleastnumbers input,k input.sort return input 4 a sorted input inpu...