题目来源:查找和最小的K对数字
给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。
找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。
解题思路:
class Pair implements Comparable<Pair>{
public int n1;
public int n2;
public int sum;
public Pair(int n1,int n2){
this.n1=n1;
this.n2=n2;
this.sum=n1+n2;
}
@Override
public int compareTo(Pair o){
//this比other小,返回<0
//this比other大,返回>0
//this和other一样大,返回0
//直接用sum值来衡量Pair的大小
return this.sum-o.sum;
}
}
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result=new ArrayList<>();
if(nums1.length==0||nums2.length==0||k<=0){
return result;
}
//要想把Pair放到优先级队列中比较大小,得让他具备比较大小的功能
//所以Pair必须实现Comparable接口
PriorityQueue<Pair> queue=new PriorityQueue<>();
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums2.length;j++){
queue.offer(new Pair(nums1[i],nums2[j]));
}
}
for(int i=0;i<k&&!queue.isEmpty();i++){
Pair cur=queue.poll();
List<Integer> tmp=new ArrayList<>();
tmp.add(cur.n1);
tmp.add(cur.n2);
result.add(tmp);
}
return result;
}
}