劍指 Offer40 最小的k個數

2021-10-24 09:49:40 字數 1665 閱讀 3442

輸入整數陣列 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...