找到陣列中最大(最小)的k個數 python解法

2021-10-04 20:35:52 字數 3269 閱讀 3446

def

getleastnumbers

(self, arr: list[

int]

, k:

int)

-> list[

int]

:return

sorted

(arr)

[:k]

sorted()內部的排序方法為歸併排序

時間複雜度o(nlogn) 空間複雜度o(logn)

def

getleastnumbers

(self, arr: list[

int]

, k:

int)

-> list[

int]

:if k==0:

return

hp=arr[

:k] heapq.heapify(hp)

for i in

range

(k,len

(arr)):

if hp[0]

: heapq.heapreplace(hp,arr[i]

)return hp

時間複雜度o(nlogk),空間複雜度o(k).

節點為k的堆的插入刪除的時間複雜度為o(logk),迴圈n次,最壞情況每次迴圈都需要插入,所以時間複雜度為o(nlogk).

若求最小的k個數,則需要用最大堆。但python內建只有最小堆,因此對陣列取反。陣列的最大值取相反數後就變成最小值存入根節點中。

def

getleastnumbers

(self, arr: list[

int]

, k:

int)

-> list[

int]

:if k==0:

return

hp=[-i for i in arr[

:k]]

heapq.heapify(hp)

for i in

range

(k,len

(arr)):

if-hp[0]

>arr[i]

: heapq.heapreplace(hp,

-arr[i]

)return

[-i for i in hp]

快速選擇為快速排序的變種,快速選擇通過找到分割點所在位置,然後分別對分割點的左邊和右邊進行迭代。快速選擇只迭代一邊,k在哪邊就迭代那邊,另一邊k之後的值不輸出,因此不需要排序。當分割點為k時,則分割點左邊的就是最小的k個數。

最小的k個數

def

getleastnumbers

(self, arr: list[

int]

, k:

int)

-> list[

int]

:def

findkmin

(alist,start,end,k)

: low=start

high=end

index=random.randint(low,high)

#隨機取分隔值

alist[index]

,alist[low]

= alist[low]

,alist[index]

mid_value=alist[low]

while lowwhile low>= mid_value:

high -=

1 alist[low]

= alist[high]

while low<= mid_value:

low +=

1 alist[high]

= alist[low]

alist[low]

= mid_value

if low == k-1:

return alist[

:k]elif low > k-1:

return findkmin(alist,start,low-

1,k)

else

:return findkmin(alist,low+

1,end,k)

if k==0:

return

return findkmin(arr,0,

len(arr)-1

,k)

最大的k個數

def

findkthlargest

(self, nums: list[

int]

, k:

int)

->

int:

deffindkmax

(alist,start,end,k)

: low=start

high=end

index=random.randint(low,high)

alist[index]

,alist[low]

= alist[low]

,alist[index]

mid_value=alist[low]

while lowwhile low>= mid_value:

high -=

1 alist[low]

= alist[high]

while low<= mid_value:

low +=

1 alist[high]

= alist[low]

alist[low]

= mid_value

if low ==

len(alist)

-k:return alist[

-k:]

elif low >

len(alist)

-k:return findkmax(alist,start,low-

1,k)

else

:return findkmax(alist,low+

1,end,k)

if k==0:

return

return findkmax(nums,0,

len(nums)-1

,k)

時間複雜度平均為o(n),最壞為o(n2)

空間複雜度平均為o(logn),最壞為o(n)

找到無序陣列中最小的k個數

找到無序陣列中最小的k個數 給定乙個整型陣列arr,找到其中最小的k個數。輸入描述 輸入包含兩行,第一行包含兩個整數n和k 1 k n 105 1 leq k leq n leq 10 5 1 k n 105 代表陣列arr的長度,第二行包含n個整數,代表陣列arr 1 a rri 109 arr ...

8 4找到無序陣列中最小的k個數

題目 給定乙個無序的整型陣列arr,找到其中最小的k個數。時間複雜度至少為o nlogk 實現public int getminknumsbyheap int arr,int k int kheap newint k 代表目前被選出的k個最小的數 for int i 0 i k i for int ...

陣列與矩陣 找到無序陣列中最小的k個數

題目 給定乙個無序的整型陣列arr,找到其中最小的k個數。要求 如果陣列arr的長度為n,排序之後自然可以得到最小的k個數,此時時間複雜度與排序演算法的時間複雜度相同,為o nlogn 本題要求讀者實現時間複雜度為o nlogk 和o n 的方法。基本思路 o nlogk 的方法。思路很簡單,就是一...