给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。
找到和最小的 k 对数字 (u1,v1), (u2,v2) ... (uk,vk)。
示例 1:
输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
示例 2:
输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
示例 3:
输入: nums1 = [1,2], nums2 = [3], k = 3
输出: [1,3],[2,3]
解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]
package Solution373;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> wl = new ArrayList<List<Integer>>();
List<ArrayList<Integer>> ll = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
ArrayList<Integer> al = new ArrayList<>();
al.add(nums1[i]);
al.add(nums2[j]);
ll.add(al);
}
}
Collections.sort(ll, new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
Integer sum1 = o1.get(0) + o1.get(1);
Integer sum2 = o2.get(0) + o2.get(1);
return sum1.compareTo(sum2);
}
});
for (int i = 0; i < k; i++) {
if (ll.size() > i) {
wl.add(ll.get(i));
}
}
return wl;
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] nums1 = { 1, 7, 11 };
int[] nums2 = { 2, 4, 6 };
int k = 3;
System.out.println(sol.kSmallestPairs(nums1, nums2, k));
}
}
package Solution373;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;
class Solution3 {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> wl = new ArrayList<List<Integer>>();
int[][] nums = new int[nums1.length * nums2.length][2];
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
nums[i * nums2.length + j] = new int[] { nums1[i], nums2[j] };
}
}
Arrays.sort(nums, Comparator.comparingInt(a -> IntStream.of(a).sum()));
for (int i = 0; i < k; i++) {
if (nums.length > i) {
ArrayList<Integer> al = new ArrayList<>();
al.add(nums[i][0]);
al.add(nums[i][1]);
wl.add(al);
}
}
return wl;
}
public int[][] cartesianProduct(int[] s1, int[] s2) {
List<int[]> list = new ArrayList<>();
for (int v1 : s1) {
for (int v2 : s2) {
list.add(new int[] { v1, v2 });
}
}
int[][] result = new int[list.size()][2];
int k = 0;
for (int[] i : list) {
result[k++] = i;
}
return result;
}
public static void main(String[] args) {
Solution3 sol = new Solution3();
int[] nums1 = { 1, 2, 4, 5, 6 };
int[] nums2 = { 3, 5, 7, 9 };
int k = 3;
System.out.println(sol.kSmallestPairs(nums1, nums2, k));
}
}
后一种超时