陣列中的第K個最大元素

2021-10-05 03:45:19 字數 1039 閱讀 6458

在未排序的陣列中找到第 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 ≤ 陣列的長度。

利用小頂堆的特性(堆頂元素最小),先對前k個陣列元素進行"原地"建小頂堆,建完小頂堆後,堆頂的元素最小,正好是這k個元素的第k大元素。

然後遍歷剩下的元素 nums[k] ~ nums[len-1]

1、如果比堆頂元素小,跳過

2、如果比堆頂元素大,和堆頂元素交換後重新堆化

建堆 buildheap 時間複雜度 o(k),遍歷剩下元素並且堆化 時間複雜度(n-k)*o(logk),總體的時間複雜度 o(nlogk)

class

solution

//k個元素的小頂堆的堆頂即是第k大元素

return nums[0]

;}/** * 建堆函式

* 從倒數第乙個非葉子節點開始堆化,倒數第乙個非葉子節點下標為 k/2-1

*/public

static

void

bulidheap

(int

nums,

int k)

}/**

* 堆化函式

* 父節點下標i,左右子節點的下標分別為 2*i+1 和 2*i+2

*/public

static

void

heapify

(int

a,int k,

int i)

}public

static

void

swap

(int

a,int i,

int j)

}

陣列中的第k個最大元素

在未排序的陣列中找到第 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個最大元素

題目 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。法一 排序後輸出。法二 優先佇列 堆 法三 利用快速排序的方法。在這裡僅介紹法三,法一法二呼叫庫函式即可。思路 首先,找第k個最大的元素,即是找第n k 1個最小的元素。...

陣列中的第K個最大元素

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