215. 数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
输入: [3,2,3,1,2,4,5,5,6] 和 k = 2 输出: 5
//基于快排的选择算法:时空On,lognfunc findKthLargest(nums []int, k int) int {rand.Seed(time.Now().UnixNano())return quickSelect(nums, 0, len(nums)-1, len(nums)-k)}func quickSelect(a []int, l, r, index int) int {q := randomPartition(a, l, r)if q == index {return a[q]} else if q < index {return quickSelect(a, q + 1, r, index)}return quickSelect(a, l, q - 1, index)}func randomPartition(a []int, l, r int) int {i := rand.Int() % (r - l + 1) + la[i], a[r] = a[r], a[i]return partition(a, l, r)}func partition(a []int, l, r int) int {x := a[r]i := l - 1for j := l; j < r; j++ {if a[j] <= x {i++a[i], a[j] = a[j], a[i]}}a[i+1], a[r] = a[r], a[i+1]return i + 1}

//基于堆排的选择方法:时空nlogn,lognfunc findKthLargest(nums []int, k int) int {heapSize := len(nums)buildMaxHeap(nums, heapSize)for i := len(nums) - 1; i >= len(nums) - k + 1; i-- {nums[0], nums[i] = nums[i], nums[0]heapSize--maxHeapify(nums, 0, heapSize)}return nums[0]}func buildMaxHeap(a []int, heapSize int) {for i := heapSize/2; i >= 0; i-- {maxHeapify(a, i, heapSize)}}func maxHeapify(a []int, i, heapSize int) {l, r, largest := i * 2 + 1, i * 2 + 2, iif l < heapSize && a[l] > a[largest] {largest = l}if r < heapSize && a[r] > a[largest] {largest = r}if largest != i {a[i], a[largest] = a[largest], a[i]maxHeapify(a, largest, heapSize)}}

