姊妹问题: 面试题 17.14. 最小K个数
&此题为使用 快速排序 进行求解的典型 &
因为第K个,正好对应快排枢纽值pivot右侧的元素
但因为此题没有时间/空间复杂度要求,可以用任何排序.
也可以使用堆排序中堆化部分的代码,只选出前K个最大元素.
形式上最简单的就是先不管,排好序,(如果是从大到小排)然后再取第K个,即为第K大的元素
在此使用堆排序
215. 数组中的第K个最大元素
难度: 中等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| func findKthLargest(nums []int, k int) int { heapSort(nums) return nums[len(nums)-k] }
type Heap struct { arr []int size int }
func createHeap(arr []int) (h Heap) { h.arr = arr h.size = len(arr)
for i := h.size / 2; i >= 0; i-- { adjustHeap(h, i) } return }
func adjustHeap(h Heap, parentNode int) { leftNode := parentNode*2 + 1 rightNode := parentNode*2 + 2
maxNode := parentNode if leftNode < h.size && h.arr[maxNode] < h.arr[leftNode] { maxNode = leftNode } if rightNode < h.size && h.arr[maxNode] < h.arr[rightNode] { maxNode = rightNode }
if maxNode != parentNode { h.arr[maxNode], h.arr[parentNode] = h.arr[parentNode], h.arr[maxNode] adjustHeap(h, maxNode) } }
func heapSort(arr []int) { h := createHeap(arr)
for h.size > 0 { h.arr[0], h.arr[h.size-1] = h.arr[h.size-1], h.arr[0] h.size-- adjustHeap(h, 0) } }
|
如果时间复杂度要求是O(N),可参考:
Top K 问题
找出一个数组里面前K个最大数
原文链接: https://dashen.tech/2015/03/01/leetcode-215-数组中的第K个最大元素/
版权声明: 转载请注明出处.