给定A、B两个数列,各包含n个数,分别从A和B中任意取一个数相加得到和,这样会有n^2种结果(包括重复的),求n^2个结果中前n个最小的和。java实现
时间: 2024-03-10 20:43:27 浏览: 70
可以使用小根堆来实现。首先将A和B中的第一个数相加得到初始和,将这个和和对应的A、B数组下标加入小根堆中。然后每次从小根堆中取出堆顶元素,即当前和最小的那个,将其加入结果数组中,然后分别考虑其下一个和,即将其下标对应的A和B数组中下一个数相加得到的和加入小根堆中,直到取出前n个最小的和为止。
以下是Java代码实现:
```java
import java.util.*;
public class MinSum {
public static void main(String[] args) {
int[] A = {1, 3, 5, 7};
int[] B = {2, 4, 6, 8};
int n = 4;
int[] res = minSums(A, B, n);
System.out.println(Arrays.toString(res)); // [3, 4, 5, 6]
}
public static int[] minSums(int[] A, int[] B, int n) {
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> A[a[0]] + B[a[1]]));
pq.offer(new int[]{0, 0});
int[] res = new int[n];
for (int i = 0; i < n; i++) {
int[] curr = pq.poll();
res[i] = A[curr[0]] + B[curr[1]];
if (curr[0] < n - 1) {
pq.offer(new int[]{curr[0] + 1, curr[1]});
}
if (curr[1] < n - 1) {
pq.offer(new int[]{curr[0], curr[1] + 1});
}
}
return res;
}
}
```
阅读全文