LeetCode:找出和最小的k对数字

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))
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值