python第k序列元素查找_【python】寻找数组中第k大的元素
題目鏈接:https://www.nowcoder.com/question/next?pid=13956292&qid=298692&tid=26431616
方法一:
最簡單直接的方法:先排序再找
最簡單直接的想法是首先進行排序。假設元素的數量不大,比如才幾千個,那就可以先進行排序,比如用快排或堆排,平均時間復雜度為O(N*logN),然后取出前k個,于是總時間復雜度為O(NlogN)+O(k)=O(NlogN)。當然這種做法是浪費了不少的時間的,因為題目只要求找出第k大的元素,而不需要數據是有序的。
方法二:
比較直接的方法:部分元素排序
https://blog.csdn.net/qq_26286193/article/details/80683004
當k比較小的時候,k趟排序是個比較不錯的方法。我們只需要排序最大的k個元素即可,剩下那些元素不需要管。
最簡單明了的就是在冒泡排序中只進行k趟起泡。
方法三:
快排的分治法
快速排序使用了分治法的策略。它的基本思想是,選擇一個基準數(一般稱之為樞紐元),通過一趟排序將要排序的數據分割成獨立的兩部分:在樞紐元左邊的所有元素都不比它大,右邊所有元素都比它大,此時樞紐元就處在它應該在的正確位置上了。在本問題中,假設有N個數存儲在數組a中。
我們從a中隨機找出一個元素作為樞紐元,把數組分為兩部分。其中左邊元素都不比樞紐元大,右邊元素都不比樞紐元小。此時樞紐元所在的位置記為mid。
如果右半邊(包括a[mid])的長度恰好為k,說明a[mid]就是需要的第k大元素,直接返回a[mid]。
如果右半邊(包括a[mid])的長度大于k,說明要尋找的第k大元素就在右半邊,往右半邊尋找。
如果右半邊(包括a[mid])的長度小于k,說明要尋找的第k大元素就在左半邊,往左半邊尋找。
num = list(map(int,input()[1:-1].split(',')))
k = 3
def quick(num,left,right,k):
low = left
high = right
base = num[left]
while low < high:
while low < high and num[high] > base:
high -= 1
num[low] = num[high]
while low < high and num[low] < base:
low += 1
num[high] = num[low]
num[low] = base
if low == k:
return num[low]
elif low < k:
return quick(num,low+1,right,k)
else:
return quick(num,left,low-1,k)
print(quick(num,0,len(num)-1,k))
總結
以上是生活随笔為你收集整理的python第k序列元素查找_【python】寻找数组中第k大的元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word控件Spire.Doc 【邮件合
- 下一篇: python名片管理教程_使用pytho