题目描述:给两个数组A1,A2,数组为递增排序,以及一个整数k,从A1中选取一个整数a,从A2中选取一个整数b,构成组合(a,b),重复k次,选取的a+b的值逐渐递增,具体可参见下面两个例子:
若nums1 = [1,7,11], nums2 = [2,4,6], k = 3
两个数组产生的所有序列为:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
则返回前三个[1,2],[1,4],[1,6]
若nums1 = [1,1,2], nums2 = [1,2,3], k = 2
两个数组产生的所有序列为:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
则返回前两个[1,1],[1,1]
算法思路如下:
采用队列存储每一个组合,每次选取队首元素出队,并记录该元素已访问,队首元素即是当前需要的最小值,java中有一个类PriorityQueue,
可实现一个关于Pair的类并实现Comparable类,也就是一个组合,这样当新的组合加入到队列中,可将新加入的对象进行排序,这样每次队首的元素都是最小值,代码实现如下:
public class Solution {
class Pair implements Comparable
{
int r;
int c;
int val1;
int val2;
Pair(int r1,int c1,int x,int y){
r = r1;
c = c1;
val1 = x;
val2 = y;
}
@Override
public int compareTo(Pair arg0) {
// TODO Auto-generated method stub
return (val1+val2)-(arg0.val1+arg0.val2);
}
}
public static List kSmallestPairs(int[] nums1, int[] nums2, int k) {
Listresult = new ArrayList();
if(k==0 || nums1.length==0 || nums2.length==0){
return result;
}
PriorityQueue ll = new PriorityQueue();
boolean [][]visited = new boolean[nums1.length][nums2.length];
ll.add(new Solution().new Pair(0,0,nums1[0],nums2[0]));
visited[0][0] = true;
int i=0;
while(i if(ll.isEmpty())
break;
Pair p= ll.poll();
int row = p.r;
int column = p.c;
int []temp = {nums1[row],nums2[column]};
result.add(temp);
if(row+1 ll.add(new Solution().new Pair(row+1,column,nums1[row+1],nums2[column]));
visited[row+1][column] = true;
}
if(column+1 ll.add(new Solution().new Pair(row,column+1,nums1[row],nums2[column+1]));
visited[row][column+1] = true;
}
i++;
}
return result;
}
}