牛客 劍指offer系列題解 最小的K個數

2021-10-05 17:45:12 字數 2542 閱讀 8158

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。

1、問題描述:

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

2、資料結構:

二叉樹,堆

3、題解:

方法1:排序,取前k個數

# -*- coding:utf-8 -*-

class

solution

:def

getleastnumbers_solution

(self, tinput, k)

:# write code here

iflen

(tinput)

< k or k<=0:

return

return

sorted

(tinput)

[:k]

方法2:大根堆

查詢最小的k個數,用大根堆;查詢最大的k個數,用小根堆。

首先,由輸入陣列的前k個值,建立長度為k的大根堆,先把新值放到末尾,然後與父節點比較,大於父節點就交換

然後比較與大根堆的根結點的關係,並調整大根堆,即遍歷之後的數,判斷每個數與大根堆的根節點的大小,小於根結點就把根節點替換掉,然後,迴圈判斷與子節點的關係,小於子節點(與較大的子節點比較即可)則交換,知道葉子結點。

# -*- coding:utf-8 -*-

class

solution

:def

getleastnumbers_solution

(self, tinput, k)

:# write code here

#大根堆

#建立大根堆

defcreateheap

(arr)

: m =

len(maxheap)

currentindex = m -

1while currentindex !=0:

parentindex =

(m -1)

>>

1if maxheap[currentindex]

> maxheap[parentindex]

: maxheap[currentindex]

,maxheap[parentindex]

= maxheap[parentindex]

,maxheap[currentindex]

else

:break

#調整大根堆,頭結點發生改變

defadjustheap

(arr)

:if arr < maxheap[0]

: maxheap[0]

= arr

m =len(maxheap)

index =

0while index < m:

left = index *2+

1 right = index *2+

2 temp =

0if right < m:

if maxheap[left]

< maxheap[right]

: temp = right

else

: temp = left

elif left < m:

temp = left

else

:break

if maxheap[index]

< maxheap[temp]

: maxheap[index]

,maxheap[temp]

= maxheap[temp]

,maxheap[index]

index = temp

n =len(tinput)

if n < k or k <=0:

return

maxheap =

for i in

range

(n):

if i < k:

#建立大根堆

createheap(tinput[i]

)else

:#比較,調整大根堆

adjustheap(tinput[i]

)return

sorted

(maxheap)

4、複雜度分析:

方法1:

時間複雜度:o(n*logn)

空間複雜度:o(logn)

方法2:

時間複雜度:o(n*logk)

空間複雜度:o(k)

牛客 劍指offer系列題解 把陣列排成最小的數

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。1 問題描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。2 資料結構 陣列,字串,排序...

牛客劍指offer 1 10題解

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else continue 記憶體集體向右移兩個位元組 並置 0前兩個位元組 v...

牛客 劍指offer系列題解 複雜鍊錶的複製

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。1 問題描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否...