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