python劍指offer最小的K個數

2022-03-22 06:45:12 字數 1349 閱讀 9121

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

使用快排中的partition思想。

①我們設定partition函式的哨兵為key=lists[left],在partition函式中完成一輪比較的結果是,比key大的數都在其右邊,比key小的數放在其左邊。完成該輪後返回其left=right時left的值。

②我們判斷left的值是比k大還是小:

如果left的值比k大,說明上輪partition之後,lists中前left個小的數在左邊,其餘的數在其右邊,我們還需要把尋找範圍縮小,下次找的時候只在陣列前面left個數中找了。

如果left的值比k小,說明上輪partition之後,前left個數找的太少了,我們需要再往陣列的後面找。

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

"""content: 找最小的k個數

""""""

思路: 包括2個部分function_partion和function

"""def function_partion(lists, left, right):

# 劃分函式處理部分

key = lists[left]

while left < right:

while left < right and lists[right] >= key:

right -= 1

lists[left] = lists[right]

while left < right and lists[left] <= key:

left += 1

lists[right] = lists[left]

lists[right] = key

return left

def function(lists, k):

# 劃分法主要函式部分

length = len(lists)

left = 0

right = length - 1

index = function_partion(lists, left, right)

while k != index:

if index > k - 1:

right = index - 1

else:

left = index + 1

index = function_partion(lists, left, right)

return lists[0:k]

lists = [1, 1, 6, 4, 11, 9, 2, 10, 3]

print("思路(劃分法):", function(lists, 4))

劍指offer 最小k個數

1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...

Python劍指offer 旋轉陣列的最小數字

由旋轉陣列的定義可以知道,最小數字既要小於左邊的數又要小於右邊的數 另外因為陣列是非減排序的,所以陣列的原始狀態下一定是右邊的數大於中間的數大於左邊的數。利用二分查詢的思想,要想找到這個最小數說明順序陣列其中某個地方有個斷崖,所以旋轉陣列的最小數說明它是小於左邊的數的第乙個,也就是如果 rotate...

劍指offer 最小的K個數

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...