輸入整數陣列 arr ,找出其中最小的 k 個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。
示例 1:
輸入:arr = [3,2,1], k = 2
輸出:[1,2] 或者 [2,1]
示例 2:
輸入:arr = [0,1,2,1], k = 1
輸出:[0]
import heapq #建立乙個小頂堆
defgetleastnumbers
(nums,k)
: n =
len(arr)
if n <=
0or nreturn
n,opposite =
len(nums),[
-1*i for i in nums[
:k]]
#把它改為負為了建立乙個大根堆
heapq.heapify(opposite)
#排序for i in
range
(k,n):if
-opposite[0]
>nums[i]
:#乙個新的值如果小於於第乙個大的值替換
-nums[i]
)return
[-x for x in opposite]
def
getleastnumbers
(arr, k)
:if k <=
0or k >
len(arr)
:return
heap = build_heap(arr[
:k])
for i in
range
(k,len
(arr)):
if arr[i]
< heap[0]
: heap[0]
= arr[i]
sink(heap,0)
return heap
defsink
(array, k)
: n =
len(array)
left =
2* k +
1 right =
2* k +
2if left >= n:
return
max_i = left
if right < n and array[left]
< array[right]
: max_i = right
if array[max_i]
> array[k]
: array[max_i]
, array[k]
= array[k]
, array[max_i]
sink(array, max_i)
defbuild_heap
(list_)
: n =
len(list_)
for i in
range
(n//2,
-1,-
1): sink(list_, i)
return list_
劍指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...