題目:
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。
思路一:
基於堆排序o(nlogk)
(或快速排序,氣泡排序)
**:
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:def
heap
(arr)
: parent =
(len
(arr)-2
)//2for i in
range
(parent,-1
,-1)
: heapify(arr, i)
return arr
defheapify
(arr, parent)
: c1 =
2*parent +
1 c2 =
2*parent +
2 temp = parent
if c1<
len(arr)
and arr[c1]
>arr[temp]
: temp = c1
if c2<
len(arr)
and arr[c2]
>arr[temp]
: temp = c2
if temp != parent:
swap(arr, parent, temp)
heapify(arr, temp)
return arr
defheapsort
(arr)
:for i in
range
(len
(arr)-1
,-1,
-1):
swap(arr,
0, i)
arr[
:i]= heapify(arr[
:i],0)
defswap
(arr, i, j)
: temp = arr[i]
arr[i]
= arr[j]
arr[j]
= temp
if k >
len(tinput)
or k <1:
return
arr = heap(tinput[
:k])
for i in
range
(k,len
(tinput)):
if tinput[i]
< arr[0]
: arr[0]
= tinput[i]
arr = heapify(arr,0)
heapsort(arr)
return arr
思路二:
基於快速排序(partition思想)
**:
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:def
partition
(arr, left, right)
: index = left
for i in
range
(left, right)
:if arr[i]
< arr[left]
: index +=
1 arr[i]
, arr[index]
= arr[index]
, arr[i]
arr[left]
, arr[index]
= arr[index]
, arr[left]
return index
defquicksort
(arr, left, right)
:if left == right:
return
i = partition(arr, left, right)
quicksort(arr, left, i)
quicksort(arr, i+
1, right)
return arr
if k >
len(tinput)
or k <1:
return
start, end =0,
len(tinput)
index = partition(tinput, start, end)
while index != k-1:
if index < k-1:
start = index+
1 index = partition(tinput, start, end)
elif index > k-1:
end = index
index = partition(tinput, start, end)
return quicksort(tinput[
:k],
0, k)
思路三:
不要臉寫法
**:
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:return
if k >
len(tinput)
or k <
1else
sorted
(tinput)
[:k]
最小的K個數
問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...
最小的K個數
從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...
最小的K個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,如果不讓使用sort的話,自己實現乙個,或者依次選取最小的 class solution public vectorgetleastnumbers solution vectori...