sorted()內部的排序方法為歸併排序def
getleastnumbers
(self, arr: list[
int]
, k:
int)
-> list[
int]
:return
sorted
(arr)
[:k]
時間複雜度o(nlogn) 空間複雜度o(logn)
時間複雜度o(nlogk),空間複雜度o(k).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
節點為k的堆的插入刪除的時間複雜度為o(logk),迴圈n次,最壞情況每次迴圈都需要插入,所以時間複雜度為o(nlogk).
若求最小的k個數,則需要用最大堆。但python內建只有最小堆,因此對陣列取反。陣列的最大值取相反數後就變成最小值存入根節點中。
快速選擇為快速排序的變種,快速選擇通過找到分割點所在位置,然後分別對分割點的左邊和右邊進行迭代。快速選擇只迭代一邊,k在哪邊就迭代那邊,另一邊k之後的值不輸出,因此不需要排序。當分割點為k時,則分割點左邊的就是最小的k個數。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個數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)
時間複雜度平均為o(n),最壞為o(n2)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(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 的方法。思路很簡單,就是一...