给定两个升序排列的整形数组 nums1 和 nums2 ,以及一个整数 k ,定义一对值 (u,v),其中第一个元素来自 nums1 ,第二个元素来自 nums2,找到和最小的 k 对数字(u1,v1)(u2,v2)……(uk,vk)
package com.edu.Test0508;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
//找到 最小的 k 对元素
public class Test {
static class Pair{
public int num1;
public int num2;
public int sum;
public Pair(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
this.sum = num1 + num2;
}
}
class Solution{
public List<List<Integer>> kSmallestPairs(int[] nums1,int[] nums2,int k){
List<List<Integer>> result = new ArrayList<>();
if(k <= 0){
return result;
}
//先准备一个堆
PriorityQueue<Pair> queue = new PriorityQueue<>();
//构造出所有的数对,存放到 queue 中
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.num1);
tmp.add(cur.num2);
result.add(tmp);
}
return result;
}
}
}