378.kth-smallest-element-in-a-sorted-matrix.go 758 B

123456789101112131415161718192021222324252627282930313233
  1. type array [][2]int
  2. func (a array) Len() int { return len(a) }
  3. func (a array) Less(i, j int) bool { return a[i][0] < a[j][0] }
  4. func (a array) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  5. func (a *array) Push(x interface{}) {
  6. *a = append(*a, x.([2]int))
  7. }
  8. func (a *array) Pop() interface{} {
  9. x := (*a)[a.Len()-1]
  10. *a = (*a)[:a.Len()-1]
  11. return x
  12. }
  13. func kthSmallest(matrix [][]int, k int) int {
  14. n := len(matrix)
  15. idx := make([]int, n)
  16. var pq array = make([][2]int, 0)
  17. for i := 0; i < n; i++ {
  18. heap.Push(&pq, [2]int{matrix[i][0], i})
  19. }
  20. for i := 0; i < k-1; i++ {
  21. x := heap.Pop(&pq).([2]int)
  22. idx[x[1]]++
  23. if nid := idx[x[1]]; nid < n {
  24. heap.Push(&pq, [2]int{matrix[x[1]][nid], x[1]})
  25. }
  26. }
  27. return heap.Pop(&pq).([2]int)[0]
  28. }