You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer
k.Define a pair(u,v) which consists of one element from the first array and one element
from the second array.
Find the k pairs(u1,v1),(u2,v2)...(uk,vk) with the smallest sums.
Example 1:
Input:nums1=[1,7,11],nums2=[2,4,6],k=3
Output:[[1,2],[1,4],[1,6]]
Explanation:The first 3 pairs are returned from the sequence:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
Example 2:
Input:nums1=[1,1,2],nums2=[1,2,3],k=3
Output:[1,1],[1,1]
Explanation:The first 2 pairs are returned from the sequence:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
题目大意:
给定两个以升序排列的整形数组nums1和nums2以及一个整数k.定义一对(u,v),其中第一个元素来自nums1,第二个元素
来自nums2,找出和最小的k对数字(u1,v1),(u2,v2)...(uk,vk).
解题思路:
这道题给定以升序的数组.
方法1:
暴力解法.将所有的和遍历出来,然后进行排序,取前面k个.选数组进行存储,不能用map,避免重复的值
方法2:
利用优先队列.维护一个最小堆.把数值对的和放在这个最小堆中,不断pop出k个最小值到数组中.
*/
package main
import (
"container/heap"
"fmt"
"sort"
)
func kSmallPairs1(nums1,nums2 []int,k int)[][]int{
n1,n2,ans:=len(nums1),len(nums2),[][]int{}
if n1==0||n2==0||k<0{
return nil
}
for i:=0;i<n1;i++{
for j:=0;j<n2;j++{
ans=append(ans,[]int{nums1[i],nums2[j]})/*插入一维数组*/
}
}
sort.Slice(ans,func(i,j int)bool{
return ans[i][0]+ans[i][1]<ans[j][0]+ans[j][1]/*对二维数组进行升序排序*/
})
if len(ans)>=k{
return ans[:k]
}
return ans
}
/*优先队列*/
func kSmallPairs2(nums1,nums2 []int,k int)[][]int{
res,h,n1,n2:=[][]int{},&minHeap{},len(nums1),len(nums2)
if n1==0||n2==0||k<0{
return res
}
if n1*n2<k{
k=n1*n2
}
heap.Init(h)
for _,num:=range nums1{
heap.Push(h,[]int{num,nums2[0],0})
}
for len(res)<k{
min:=heap.Pop(h).([]int)
res=append(res,min[:2])
if min[2]<len(nums2)-1{
heap.Push(h,[]int{min[0],nums2[min[2]+1],min[2]+1})
}
}
return res
}
type minHeap [][]int /*利用数组对堆进行存储*/
/*实现了这五个方法的数据类型才能使用go标准库给我们提供的heap*/
func (h minHeap) Len()int{
return len(h)
}
func (h minHeap) Less(i,j int)bool{
return h[i][0]+h[i][1]<h[j][0]+h[j][1] /*最小堆*/
}
func (h minHeap) Swap(i,j int){
h[i],h[j]=h[j],h[i]
}
func (h *minHeap) Push(x interface{}){
*h=append(*h,x.([]int)) /*类型转换*/
}
func (h *minHeap) Pop() interface{}{
old:=*h
n:=len(old)
x:=old[n-1]
*h=old[0:n-1]
return x
}
func main(){
nums1,nums2:=[]int{1,1,2},[]int{1,2,3}
fmt.Println(kSmallPairs2(nums1,nums2,3))
}