題目:
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。先使用排序演算法,然後線性時間取出第k大的元素即可。時間複雜度是o(nlogn)
建乙個大小為k的最大堆或者最小堆。遍歷陣列,把遍歷到的值加入到堆當中,這個操作的時間複雜度是o(logk),遍歷n次。總共是o(nlogk)
使用python的heapq中的nlargest即可直接獲得。空間複雜度是o(k)
之所以這個方法也稱作優先佇列法,因為堆中的資料都是按照大小排好的。符合優先佇列按照值大小這個優先條件排序,所以是優先佇列。
在快排演算法中,首先要隨機選乙個基準值,把小於這個基準的值放到基準位置的左邊,把大於基準值的值放到基準值的右邊。然後在對兩個部分繼續按照這種方式遞迴的劃分。
首先要將第k大的問題看成第n-k+1小的問題。
在這道題中,我們只需要關注一邊即可,如果基準值的index大於n-k(第k大等於第n-k+1小),則只需要關注index+1到這一段的最右邊這個區域。如果基準值的index小於n-k,則我們只需要關注這一段的左邊到index-1這個區域。因為我們要的值都在這個區域內。如果等於,則已經找到了。
再來解釋一下第k大等於n-k+1小這個含義。如果乙個序列[2,3,4,1,5,6],需要找到第2大的值,是5,同時5也是第5小的值。2和5滿足 5 = n-k+1(n=6)。但是在陣列中,起始位置是從0開始的,為了統一索引位置,我們就認為5是第4小的數。
class
solution
:def
findkthlargest
(self, nums: list[
int]
, k:
int)
->
int:
defspilt
(left, right, index)
: base = nums[index]
nums[index]
, nums[right]
= nums[right]
, nums[index]
store_index = left
for i in
range
(left, right)
:if nums[i]
< base:
nums[i]
, nums[store_index]
= nums[store_index]
, nums[i]
store_index +=
1 nums[store_index]
, nums[right]
= nums[right]
, nums[store_index]
return store_index
defselect
(left, right, kthsmall)
:if left == right:
return nums[left]
index = random.randint(left, right)
index = spilt(left, right, index)
if index == kthsmall:
return nums[index]
elif index > kthsmall:
return select(left, index -
1, kthsmall)
else
:return select(index +
1, right, kthsmall)
return select(0,
len(nums)-1
,len
(nums)
- k)
LeetCode 251 展開二維向量
請設計並實現乙個能夠展開二維向量的迭代器。該迭代器需要支援 next 和 hasnext 兩種操作。示例 vector2d iterator newvector2d 1,2 3 4 iterator.next 返回 1 iterator.next 返回 2 iterator.next 返回 3 it...
提高專案25 1 陣列的排序
任務和 編寫函式,完成氣泡排序。檔名 main.c 完成日期 2016.7.6 問題描述 編寫函式,完成氣泡排序 程式輸出 include void bubble sort int a,int n void output array int b,int m int main int b 15 bub...
leetcode陣列中的問題(十)
目錄 面試題 08.04.冪集 同78.子集 90.子集 ii 46.全排列 77.組合 39.組合總和 冪集。編寫一種方法,返回某集合的所有子集。集合中不包含重複的元素。說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路 一 ...