LeetCode 251 陣列中的第K個最大元素

2021-10-01 17:35:32 字數 1930 閱讀 6017

題目:

在未排序的陣列中找到第 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 思路 一 ...