陣列中的第k個最大元素

2021-10-21 01:54:31 字數 1521 閱讀 5821

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

解法一:時間o(nlogn),空間o(1)

public

class

solution

}

解法二:快排

class

solution

else

if(index>target)

else

if(indexprivate

intpartition

(int

nums,

int i,

int j)

if(i=nums[j]

;while

(i=nums[i])if

(i=nums[i];}

nums[i]

=key;

return i;

}}

解法三:大根堆 時間o(nlogn)

class

solution

return nums[0]

;}private

void

buildmaxheap

(int

nums,

int heaplength)

}private

void

maxheapify

(int i,

int[

] nums,

int heaplength)

else

if(r>nums[largest])if

(i!=largest)

}private

void

swap

(int

nums,

int i,

int largest)

}

解法四:優先佇列

優先佇列是用堆來實現的

compare()返回值:

(a, b) -> a - b 公升序

(a, b) -> b - a 降序

public

class

solution

for(

int i =

0; i < len - k; i++

)return minheap.

peek()

;}}

陣列中的第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...