【Leetcode】373. Find K Pairs with Smallest Sums

题目:https://leetcode.com/problems/find-k-pairs-with-smallest-sums/#/description

意思是,给定两个有序数组,返回第k小的pair。大小由和决定。

对于非单一数组而言,找顺序统计量的好办法是使用最小堆。

所以一个很直接的思路就是把所有的点对加入到最小堆,然后输出前k个。问题就是没有利用到题目中“两个数组都有序这个条件”,就算数组无序,也可以利用这个方法。要利用有序这个条件,可以借助mergesort的思路。pair的第一个元素至多包含了nums1数组的前k个元素,k以后的可以不用考虑。所以,这形成了k个list,每一个list都包含了nums2的元素。每一次取所有list中的最小值,然后该list下一个元素入队。

代码:

 public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
    	List<int[]> r = new ArrayList<>();
    	if(nums1.length == 0 || nums2.length == 0) return r;
    	int size = Math.min(nums1.length, k);
    	int[] index = new int[size];
    	PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>(){
			@Override
			public int compare(int[] o1, int[] o2) {
				Integer s1 = o1[0] + o1[1];
				Integer s2 = o2[0] + o2[1];
				return s1.compareTo(s2);
			}
    	});
    	for(int i = 0; i < size; i++){
    		queue.add(new int[]{nums1[i], nums2[0], i});
    	}
    	int count = 0;
    	while(!queue.isEmpty()){
    		int[] pair = queue.poll();
    		r.add(new int[]{pair[0], pair[1]});
    		int id = pair[2];
    		if(++index[id] < nums2.length)
    			queue.add(new int[]{nums1[id], nums2[index[id]], id});
    		count++;
    		if(count == k)
    			break;
    	}
    	return r;
    }
对于入队的每一个pair,必须记录当前pair是哪一个list的,因此pair的第三个位置就是标识list的。然后index数组记录的是每一个list的下一个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值