題目描述
輸入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。附 這只是乙個比較簡單的方法。如果考慮...