您的位置:首页 > 大数据 > 人工智能

373. Find K Pairs with Smallest Sums

2017-02-24 08:21 344 查看
这道题和上一道很类似,就等于是把两个 数组分别作为一列和一行,然后拼成一个矩阵,当然,没有必要去正真生成一个矩阵去加和,那就傻了,耗费时间和空间

只要通过自定义Tuple,按照sum来排序,通过PriorityQueue来维护最小元素,就可以了

代码如下,就这道题来说,还是性能很高的 80-90%

public class Solution {
public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<int[]> list = new ArrayList<int[]>();
int n=nums1.length;
int m=nums2.length;
if(n==0 || m==0) return list; // 除了这个判断,一遍 bug-free
PriorityQueue<Tuple> pq = new PriorityQueue<Tuple>();
for(int i=0; i<m; i++) pq.add(new Tuple(0, i, nums1[0]+nums2[i]));
for(int i=0; i<Math.min(k, n*m); i++){
Tuple out= pq.poll();
list.add(new int[]{nums1[out.index1], nums2[out.index2]});
if(out.index1==n-1) continue;
pq.add(new Tuple(out.index1+1, out.index2, nums1[out.index1+1]+nums2[out.index2]));
}
return list;
}
}

class Tuple implements Comparable<Tuple>{
int index1, index2, sum;
public Tuple(int x, int y, int sum){
this.index1=x;
this.index2=y;
this.sum=sum;
}
@Override
public int compareTo(Tuple that){
return this.sum-that.sum;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: