215 数组中的第K个最大元素-中等

题目:

给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

分析:

算法1:直接排序,返回第k个

算法2:小顶堆

// date 2024/01/03
func findKthLargest(nums []int, k int) int {
    res := make([]int, k)
    idx := 0
    for _, v := range nums {
        if idx < k {
            res[idx] = v
            idx++
            if idx == k {
                makeMinHeap(res)
            }
        } else if v > res[0] {
            res[0] = v
            minHeapify(res, 0)
        }
    }
    return res[0]
}

// 把 arr 数组变成最小堆
func makeMinHeap(arr []int) {
    for i := len(arr)/2 - 1; i >= 0; i-- {
        minHeapify(arr, i)
    }
}

// sink
// 把较小值浮到上面
func minHeapify(arr []int, i int) {
    n := len(arr)
    if i > n {
        return
    }
    temp := arr[i]

    // left = 2*i + 1
    // right = left + 1
    l := i << 1 + 1
    for l < n {
        // 取左右节点中的较小值
        if l+1 < n && arr[l+1] < arr[l] {
            l++
        }
        // 如果 父结点小于左右节点,那么最小堆已成立,直接跳出
        if arr[i] < arr[l] {
            break
        }
        // swap
        arr[i] = arr[l]
        arr[l] = temp

        i = l
        l = i << 1 + 1
    }
}

最后更新于