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%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!