| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | 
							- type pair struct {
 
- 	_1 int
 
- 	_2 int
 
- }
 
- type pairs []pair
 
- func (ps pairs) Len() int           { return len(ps) }
 
- func (ps pairs) Less(i, j int) bool { return ps[i]._1 < ps[j]._1 }
 
- func (ps pairs) Swap(i, j int)      { ps[i], ps[j] = ps[j], ps[i] }
 
- func (ps *pairs) Push(x interface{}) {
 
- 	*ps = append(*ps, x.(pair))
 
- }
 
- func (ps *pairs) Pop() interface{} {
 
- 	x := (*ps)[ps.Len()-1]
 
- 	*ps = (*ps)[:ps.Len()-1]
 
- 	return x
 
- }
 
- func kSmallestPairs(nums1 []int, nums2 []int, k int) (res [][]int) {
 
- 	m, n := len(nums1), len(nums2)
 
- 	if m == 0 || n == 0 {
 
- 		return
 
- 	}
 
- 	idx := make([]int, m)
 
- 	if m*n < k {
 
- 		k = m * n
 
- 	}
 
- 	var ps pairs = make([]pair, 0)
 
- 	for i := 0; i < m; i++ {
 
- 		heap.Push(&ps, pair{nums1[i] + nums2[0], i})
 
- 	}
 
- 	for i := 0; i < k; i++ {
 
- 		x := heap.Pop(&ps).(pair)
 
- 		res = append(res, []int{nums1[x._2], nums2[idx[x._2]]})
 
- 		idx[x._2]++
 
- 		if idx[x._2] < n {
 
- 			heap.Push(&ps, pair{nums1[x._2] + nums2[idx[x._2]], x._2})
 
- 		}
 
- 	}
 
- 	return
 
- }
 
- type nx2Arr [][]int
 
- func (arr nx2Arr) Len() int           { return len(arr) }
 
- func (arr nx2Arr) Less(i, j int) bool { return arr[i][0]+arr[i][1] < arr[j][0]+arr[j][1] }
 
- func (arr nx2Arr) Swap(i, j int)      { arr[i], arr[j] = arr[j], arr[i] }
 
- func kSmallestPairsBS(nums1 []int, nums2 []int, k int) [][]int { // Brute search
 
- 	m, n := len(nums1), len(nums2)
 
- 	var sorted nx2Arr = make([][]int, m*n)
 
- 	for l, i := 0, 0; i < m; i++ {
 
- 		for j := 0; j < n; j++ {
 
- 			sorted[l] = []int{nums1[i], nums2[j]}
 
- 			l++
 
- 		}
 
- 	}
 
- 	sort.Sort(sorted)
 
- 	if m*n <= k {
 
- 		return sorted
 
- 	}
 
- 	return sorted[:k]
 
- }
 
 
  |