劍指offer 最小的k個數

2021-09-27 05:12:17 字數 1797 閱讀 4922

題目描述

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

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

# @time : 2019-07-08 21:09

# @author : jayce wong

# @projectname : job

# @filename : getleastnumbers.py

# @blog :

# @github :

class solution:

"""從陣列中尋找最小的k個數字,一般來說最直接的做法就是先將這個陣列排序,然後取最小的k個數字即可。

但是這樣做的時間複雜度為o(nlogn)

解法1:

借鑑快排中partition()的做法,因為partition()每次可以確定乙個下標的正確元素,並保證其左右與其

大小關係有序。所以只要我們通過partition()確定了下標為k-1的元素,那麼其左邊都是小於該元素的。

時間複雜度為o(n)

解法2:

可以維護乙個容量為k的容器,然後遍歷整個陣列,如果遇到比容器中最大值要小的元素,那麼就將這個元素

替換容器中的最大值。時間複雜度為o(nlogk)

"""def getleastnumbers_solution1(self, tinput, k):

if k <= 0 or k > len(tinput):

return

ans = tinput[:k]

for i in range(k, len(tinput)):

if tinput[i] < max(ans):

ans.remove(max(ans))

return sorted(ans)

def getleastnumbers_solution2(self, tinput, k):

def partition(begin, end):

pos = begin

for i in range(begin, end):

if tinput[i] < tinput[end]:

tinput[i], tinput[pos] = tinput[pos], tinput[i]

pos += 1

tinput[end], tinput[pos] = tinput[pos], tinput[end]

return pos

if k <= 0 or k > len(tinput):

return

start, stop = 0, len(tinput) - 1

idx = partition(start, stop)

while idx != k - 1:

if idx > k:

stop = idx - 1

else:

start = idx + 1

idx = partition(start, stop)

return sorted(tinput[: k])

def main():

nums = [4, 5, 1, 6, 2, 7, 3, 8]

k = 4

solution = solution()

print(solution.getleastnumbers_solution2(nums, k))

if __name__ == '__main__':

main()

劍指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.演...

劍指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 基於...

《劍指offer》最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...