Python實(shí)現(xiàn)查找最小的k個(gè)數(shù)示例【兩種解法】
本文實(shí)例講述了Python實(shí)現(xiàn)查找最小的k個(gè)數(shù)。分享給大家供大家參考,具體如下:
題目描述
輸入n個(gè)整數(shù),找出其中最小的K個(gè)數(shù)。例如輸入4,5,1,6,2,7,3,8這8個(gè)數(shù)字,則最小的4個(gè)數(shù)字是1,2,3,4,。
解法1
使用partition函數(shù)可以知道,使用==O(N)==的時(shí)間復(fù)雜度就可以找出第K大的數(shù)字,并且左邊的數(shù)字比這個(gè)數(shù)小,右邊的數(shù)字比這個(gè)數(shù)字大。因此可以取k為4,然后輸出前k個(gè)數(shù)字,如果需要排序的話再對結(jié)果進(jìn)行排序
# -*- coding:utf-8 -*-
class Solution:
def PartitionOfK(self, numbers, start, end, k):
if k < 0 or numbers == [] or start < 0 or end >= len(numbers) or k > end:
return
low, high = start, end
key = numbers[low]
while low < high:
while low < high and numbers[high] >= key:
high -= 1
numbers[low] = numbers[high]
while low < high and numbers[low] <= key:
low += 1
numbers[high] = numbers[low]
numbers[low] = key
if low < k:
self.PartitionOfK(numbers, start + 1, end, k)
elif low > k:
self.PartitionOfK(numbers, start, end - 1, k)
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if k <= 0 or tinput == [] or k > len(tinput):
return []
self.PartitionOfK(tinput, 0, len(tinput) - 1, k)
return sorted(tinput[0:k])
#測試:
sol = Solution()
listNum = [4,5,1,6,2,7,3,8]
rel = sol.GetLeastNumbers_Solution(listNum, 4)
print(rel)
運(yùn)行時(shí)間:30ms
占用內(nèi)存:5732k
解法2
解法1存在兩個(gè)問題,一個(gè)是partition把數(shù)組的順序改變了,第二是無法處理海量的數(shù)據(jù),海量的數(shù)組全部導(dǎo)入到內(nèi)存里面做partition顯然是不合適的。因此可以找出結(jié)果中最大的數(shù)字,如果遍歷的數(shù)字比這個(gè)數(shù)字小,則替換,否則不變,可以采用堆的形式來實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),達(dá)到O(logK)的復(fù)雜度,因此整體的時(shí)間復(fù)雜度為N*O(logK)
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if tinput == [] or k <= 0 or k > len(tinput):
return []
result = []
for num in tinput:
if len(result) < k:
result.append(num)
else:
if num < max(result):
result[result.index(max(result))] = num
return sorted(result)
#測試:
sol = Solution()
listNum = [4,5,1,6,2,7,3,8]
rel = sol.GetLeastNumbers_Solution(listNum, 4)
print(rel)
運(yùn)行結(jié)果同上
運(yùn)行時(shí)間:25ms
占用內(nèi)存:5724k
時(shí)間和空間占用都比解法1更優(yōu)。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
- Python使用min、max函數(shù)查找二維數(shù)據(jù)矩陣中最小、最大值的方法
- Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)找到最大或最小的N個(gè)元素實(shí)現(xiàn)方法示例
- Python實(shí)現(xiàn)在某個(gè)數(shù)組中查找一個(gè)值的算法示例
- Python查找兩個(gè)有序列表中位數(shù)的方法【基于歸并算法】
- Python有序查找算法之二分法實(shí)例分析
- python二分查找算法的遞歸實(shí)現(xiàn)方法
- Python實(shí)現(xiàn)二分查找算法實(shí)例
- python快速查找算法應(yīng)用實(shí)例
- Python中的二叉樹查找算法模塊使用指南
相關(guān)文章
Python使用StringIO和BytesIO讀寫內(nèi)存數(shù)據(jù)
這篇文章介紹了Python使用StringIO和BytesIO讀寫內(nèi)存數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
解決Pycharm后臺(tái)indexing導(dǎo)致不能run的問題
今天小編就為大家分享一篇解決Pycharm后臺(tái)indexing導(dǎo)致不能run的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
python訓(xùn)練數(shù)據(jù)時(shí)打亂訓(xùn)練數(shù)據(jù)與標(biāo)簽的兩種方法小結(jié)
今天小編就為大家分享一篇python訓(xùn)練數(shù)據(jù)時(shí)打亂訓(xùn)練數(shù)據(jù)與標(biāo)簽的兩種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
python3 pathlib庫Path類方法總結(jié)
這篇文章主要介紹了python3 pathlib庫Path類方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Python項(xiàng)目目錄找不到.git文件怎么刪除
這篇文章主要介紹了Python項(xiàng)目目錄找不到.git文件怎么刪除的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
python自動(dòng)化測試中APScheduler?Flask的應(yīng)用示例
這篇文章主要為大家介紹了python自動(dòng)化測試中APScheduler?Flask的應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
使用 Python 快速實(shí)現(xiàn) HTTP 和 FTP 服務(wù)器的方法
這篇文章主要介紹了使用 Python 快速實(shí)現(xiàn) HTTP 和 FTP 服務(wù)器 的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07

