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

数组中的第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大的数字

代码:

func findKthLargest(nums []int, k int)int{
        heapSize := len(nums)
        start := heapSize/ 2
        //制造初始大顶堆
        for i:=start;i>=0;i--{
           MaxHeaPify(nums,i,heapSize)
        }
        for i:=0;i<k-1;i++{
            nums[heapSize-1] , nums[0] = nums[0] , nums[heapSize-1]
            heapSize--
            MaxHeaPify(nums,0,heapSize)
        }
    return nums[0]
}
func MaxHeaPify(nums []int,i int,heapSize int)  {
    l,r,largest := i*2+1,i*2+2,i
    if l<heapSize && nums[l] > nums[largest]{
        largest = l
    }
    if r<heapSize &&nums[r] >nums[largest]{
        largest = r
    }
    if i !=largest{
        nums[i] ,nums[largest] = nums[largest] ,nums[i]
        MaxHeaPify(nums,largest,heapSize)
    }

}

代码效率:

执行用时:8 ms, 在所有 Go 提交中击败了85.94%的用户
内存消耗:3.4 MB, 在所有 Go 提交中击败了89.56%的用户