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

题目要求:返回数组中第K大元素

题目链接:https://leetcode-cn.com/problems/sort-an-array/

算法分析:利用小顶堆保存K的元素,则堆顶就是想要的结果。

首先将前k个元素保存,然后初始化小顶堆;继续遍历,如果元素大于堆顶元素,则与堆顶元素交换,重新调整小顶堆。

// date 2022/09/24
func findKthLargest(nums []int, k int) int {
	res := make([]int, 0, k)
	for i := 0; i < len(nums); i++ {
		if i < k {
			res = append(res, nums[i])
			if len(res) == k {
				makeMinHeap(res)
			}
		} else if nums[i] > res[0] {
			res[0] = nums[i]
			minHeapify(res, 0)
		}
	}
	return res[0]
}

// 采用自底向上的建堆方法
func makeMinHeap(nums []int) {
	for i := len(nums) >> 1 - 1; i >= 0; i-- {
		minHeapify(nums, i)
	}
}

//
func minHeapify(nums []int, k int) {
	if k > len(nums) {
		return
	}	
	temp, n := nums[k], len(nums)
	l, r := k<<1+1, k<<1+2
	for l < n {
		r = l+1
		if r < n && nums[r] < nums[l] {
			l++
		}
		if nums[k] < nums[l] {
			break
		}
		nums[k] = nums[l]
		nums[l] = temp
		k = l
		l = k<<1+1
	}
}

最后更新于