最小的K個數

2021-10-03 03:39:16 字數 3169 閱讀 5044

題目:

輸入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...