劍指offer 040找出無序陣列中前K小的數

2021-09-01 17:11:39 字數 1320 閱讀 6211

# 利用快排思想

class solution:

def function(self, array, k):

index = self.partition(array, 0, len(array)-1)

while index != k-1:

if index > k-1:

index = self.partition(array, 0, index-1)

if index < k-1:

index = self.partition(array, index+1, len(array)-1)

print(array[0:k])

def partition(self, array, start, end):

i = start

j = end

while i < j:

while array[j] >= array[start] and i < j: # 必須左邊先動 以陣列第乙個數作為哨兵,找到小於(不能小於等於,不然會卡在哨兵那裡)哨兵的數

j -= 1

while array[i] <= array[start] and i < j: # 以陣列第乙個數作為哨兵,找到大於(不能大於等於)哨兵的數

i += 1

# 交換

temp = array[j]

array[j] = array[i]

array[i] = temp

"""當指標相碰的時候,指標指向的數,一定大於哨兵

指標相碰的兩種情況:

1.j向左一步,與i相碰

1.1 i沒有動過

相碰的地方是哨兵

1.2 i動過

根據上一次的交換,i指向的數字一定是小於哨兵,所以i指向的數與哨兵交換,合理

2.i向右一步,與j相碰

這種情況只發生在j沒有動過的時候,相碰的地方就是最後乙個資料,因為程式裡面是j先動,根據上次的交換,array[j],一定大於哨兵

即滿足j移動的條件。

綜上,最後i指向的數子一定小於等於哨兵,(等於僅僅在1.1情況發生),所以,再進行一次交換,一趟完成

"""temp = array[start]

array[start] = array[i]

array[i] = temp

return i

if __name__ == '__main__':

# 測試用例

a = [99, 2, 1, 4, 5, 6, 9, 8, -1]

s = solution()

s.function(a, 5)

劍指Offer之有序陣列查詢

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 如題所示,它的行和列都是遞增的。那麼我們需要試圖找到邊界點,...

劍指offer 找出陣列中重複的數字

問題 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍裡,不知道重複的數字,也不知道每個重複數字重複幾次,找出陣列中所有重複的數字,如輸入,則應輸出。要求1 能改變陣列中的數字 思路1 將陣列排序,然後遍歷陣列,找出重複的數字。時間複雜度o nlogn 空間複雜度o 1 思路1的實現 vecto...

劍指offer 找出陣列中重複的數字

題目 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但是不知道有幾個數字重複了,也不知道每個數字重複了幾次,請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼輸出的重複數字2或者3.分析 陣列中的數字為0 n 1的範圍內,如果再這個陣列中不存在重複的...