215.kth-largest-element-in-an-array.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. func findKthLargest(nums []int, k int) int {
  2. pq := NewFixedPQ(k)
  3. for i := range nums {
  4. pq.Enqueue(nums[i])
  5. }
  6. return pq.Peek()
  7. }
  8. type FixedPQ struct { // Small root heap XD
  9. Size int
  10. PQ []int
  11. }
  12. func NewFixedPQ(size int) FixedPQ {
  13. return FixedPQ{size, make([]int, 1)}
  14. }
  15. func (pq *FixedPQ) Enqueue(x int) {
  16. if pq.Len() < pq.Size {
  17. pq.PQ = append(pq.PQ, x)
  18. pq.swim(pq.Len())
  19. } else if pq.Peek() < x {
  20. pq.PQ[1] = x
  21. pq.sink(1)
  22. }
  23. }
  24. func (pq *FixedPQ) Dequeue() int {
  25. peek := pq.PQ[1]
  26. pq.Swap(1, pq.Len())
  27. pq.PQ = pq.PQ[:pq.Len()]
  28. pq.sink(1)
  29. return peek
  30. }
  31. func (pq FixedPQ) Len() int { return len(pq.PQ) - 1 }
  32. func (pq FixedPQ) Less(i, j int) bool { return pq.PQ[i] < pq.PQ[j] }
  33. func (pq FixedPQ) Swap(i, j int) { pq.PQ[i], pq.PQ[j] = pq.PQ[j], pq.PQ[i] }
  34. func (pq FixedPQ) Peek() int {
  35. return pq.PQ[1]
  36. }
  37. func (pq FixedPQ) swim(i int) {
  38. for 1 < i && pq.Less(i, i/2) {
  39. pq.Swap(i, i/2)
  40. i /= 2
  41. }
  42. }
  43. func (pq FixedPQ) sink(i int) {
  44. for 2*i <= pq.Size {
  45. j := 2*i
  46. if (j < pq.Size && pq.Less(j+1, j)) {
  47. j++ // Compare with the smaller child
  48. }
  49. if !pq.Less(j, i) {
  50. break // If ith <= jth, stop sinking
  51. }
  52. pq.Swap(i, j)
  53. i = j
  54. }
  55. }