给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组
按照降序输出
[要求]
时间复杂度为
第一行三个整数N, K分别表示数组arr1, arr2的大小,以及需要询问的数
接下来一行N个整数,表示arr1内的元素
再接下来一行N个整数,表示arr2内的元素
输出K个整数表示答案
5 4 1 2 3 4 5 3 5 7 9 11
16 15 14 14
保证
import java.util.*; public class Main { //放入大根堆中的结构 static class Node { public int index1; //arr1中的位置 public int index2; //arr2中的位置 public int sum; //arr1[index1]+arr2[index2] public Node(int i1, int i2, int s) { index1 = i1; index2 = i2; sum = s; } } public static int[] topKSum(Integer[] arr1, Integer[] arr2, int topK) { if (arr1 == null || arr2 == null || topK < 1) { return null; } topK = Math.min(topK, arr1.length * arr2.length); int[] res = new int[topK]; int resIndex = 0; //自定义比较器,实现大根堆 PriorityQueue<Node> maxHeap = new PriorityQueue<>((N1, N2) -> N2.sum - N1.sum); // set[i][j] == false , arr1[i] arr2[j] 之前没进过堆 // set[i][j] == true , arr1[i] arr2[j] 之前进过堆 //boolean[][] set = new boolean[arr1.length][arr2.length]; //使用hashset解决超内存问题 HashSet<String> positionSet = new HashSet<>(); //从右下角开始 int i1 = arr1.length - 1; int i2 = arr2.length - 1; maxHeap.add(new Node(i1, i2, arr1[i1] + arr2[i2])); //set[i1][i2] = true; positionSet.add(i1 + "_" + i2); while (resIndex != topK) { Node curNode = maxHeap.poll(); res[resIndex++] = curNode.sum; i1 = curNode.index1; i2 = curNode.index2; // if (i1 - 1 >= 0 && set[i1 - 1][i2] == false) { // set[i1 - 1][i2] = true; // maxHeap.add(new Node(i1 - 1, i2, arr1[i1 - 1] + arr2[i2])); // } // if (i2 - 1 >= 0 && set[i1][i2 - 1] == false) { // set[i1][i2 - 1] = true; // maxHeap.add(new Node(i1, i2 - 1, arr1[i1] + arr2[i2 - 1])); // } if (i1 - 1 >= 0 && !positionSet.contains(i1 - 1 + "_" + i2)) { positionSet.add(i1 - 1 + "_" + i2); maxHeap.add(new Node(i1 - 1, i2, arr1[i1 - 1] + arr2[i2])); } if (i2 - 1 >= 0 && !positionSet.contains(i1 + "_" + (i2 - 1))) { positionSet.add(i1 + "_" + (i2 - 1)); maxHeap.add(new Node(i1, i2 - 1, arr1[i1] + arr2[i2 - 1])); } } return res; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int k = in.nextInt(); Integer[] arr1 = new Integer[n]; Integer[] arr2 = new Integer[n]; for (int i = 0; i < n; i++) { arr1[i] = in.nextInt(); } for (int i = 0; i < n; i++) { arr2[i] = in.nextInt(); } //要将输入的两个数字排序 Arrays.sort(arr1); Arrays.sort(arr2); int[] res = topKSum(arr1, arr2, k); for (int re : res) { System.out.print(re + " "); } } }