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

2021-10-07 15:00:23 字數 1220 閱讀 9132

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2

輸出: 5

示例 2:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4

輸出: 4

說明:你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

很常規的堆排序的題。

堆排序,常用二叉堆,與平衡二叉樹類似。但不同的是,父節點永遠大於子節點。

也就是說,最大的元素在最上邊。(換成『小』也同理)

然後通過『上浮』(swim)和『下沉』(sink)進行操作。

由於是二叉平衡樹,故相比於用指標,直接運用陣列就可以很好的表示。k2+1 和 k2 是k節點的兩個子節點,同時k/2取floor也是k的父節點。(注意此處的陣列從1開始計數,0處棄之不用。)

此題中,將所有陣列中的前一半數進行sink操作,確保其堆有序。(按照二叉平衡樹的性質,只需要排列前一半的數,後一半的數一定是葉子節點,一定堆有序)。

然後,要想取第k大的元素。刪除k-1次最大的元素即可。刪除最大的元素可以把根節點——nums處的元素和陣列中最後的元素互換,然後size–,再把換來的新numssink到應處的位置即可。

void

sink

(vector<

int>

& nums,

int now ,

int size)

if(r < size && nums[r]

> nums[large])if

(large != now)

}int

findkthlargest

(vector<

int>

& nums,

int k)

;for

(auto i = nums.

cbegin()

; i != nums.

cend()

; i++

)for

(int i = size /2+

1; i >

0; i--

)for

(size_t i =

0; i < k-

1; i++

)return heap[1]

;}

leetcode刷題 陣列 陣列的度

給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相...

LeetCode刷題筆記第26題

題目 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用o 1 額外空間的條件下完成。題目分析 做題之前一定要將題目分析的細緻一些,因為有些條件如果一旦不注意就會造成程式結果出現偏差或者執行不通過...

LeetCode刷題筆記第35題

題目描述 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。解題思路 最直接的想法就是使用二分查詢,如果有序陣列中含有與target值相等的元素,直接返回對應的索引值 如果沒有則在查詢完畢之後,返回對應...