373.find-k-pairs-with-smallest-sums.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. type pair struct {
  2. _1 int
  3. _2 int
  4. }
  5. type pairs []pair
  6. func (ps pairs) Len() int { return len(ps) }
  7. func (ps pairs) Less(i, j int) bool { return ps[i]._1 < ps[j]._1 }
  8. func (ps pairs) Swap(i, j int) { ps[i], ps[j] = ps[j], ps[i] }
  9. func (ps *pairs) Push(x interface{}) {
  10. *ps = append(*ps, x.(pair))
  11. }
  12. func (ps *pairs) Pop() interface{} {
  13. x := (*ps)[ps.Len()-1]
  14. *ps = (*ps)[:ps.Len()-1]
  15. return x
  16. }
  17. func kSmallestPairs(nums1 []int, nums2 []int, k int) (res [][]int) {
  18. m, n := len(nums1), len(nums2)
  19. if m == 0 || n == 0 {
  20. return
  21. }
  22. idx := make([]int, m)
  23. if m*n < k {
  24. k = m * n
  25. }
  26. var ps pairs = make([]pair, 0)
  27. for i := 0; i < m; i++ {
  28. heap.Push(&ps, pair{nums1[i] + nums2[0], i})
  29. }
  30. for i := 0; i < k; i++ {
  31. x := heap.Pop(&ps).(pair)
  32. res = append(res, []int{nums1[x._2], nums2[idx[x._2]]})
  33. idx[x._2]++
  34. if idx[x._2] < n {
  35. heap.Push(&ps, pair{nums1[x._2] + nums2[idx[x._2]], x._2})
  36. }
  37. }
  38. return
  39. }
  40. type nx2Arr [][]int
  41. func (arr nx2Arr) Len() int { return len(arr) }
  42. func (arr nx2Arr) Less(i, j int) bool { return arr[i][0]+arr[i][1] < arr[j][0]+arr[j][1] }
  43. func (arr nx2Arr) Swap(i, j int) { arr[i], arr[j] = arr[j], arr[i] }
  44. func kSmallestPairsBS(nums1 []int, nums2 []int, k int) [][]int { // Brute search
  45. m, n := len(nums1), len(nums2)
  46. var sorted nx2Arr = make([][]int, m*n)
  47. for l, i := 0, 0; i < m; i++ {
  48. for j := 0; j < n; j++ {
  49. sorted[l] = []int{nums1[i], nums2[j]}
  50. l++
  51. }
  52. }
  53. sort.Sort(sorted)
  54. if m*n <= k {
  55. return sorted
  56. }
  57. return sorted[:k]
  58. }