From 8a55b8e866fc23a7b836fa8f45b0998b2dc28580 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Wed, 11 Aug 2021 15:59:03 +0800 Subject: [PATCH] =?UTF-8?q?373:=E6=9F=A5=E6=89=BE=E5=92=8C=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=9A=84K=E5=AF=B9=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/FindKPairsWithSmallestSums.java | 84 +++++++++++++++++++ .../editor/cn/FindKPairsWithSmallestSums.md | 45 ++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.java create mode 100644 src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.md diff --git a/src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.java b/src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.java new file mode 100644 index 0000000..f5d6c5b --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.java @@ -0,0 +1,84 @@ +//给定两个以升序排列的整数数组 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] +// +// +// +// +// 提示: +// +// +// 1 <= nums1.length, nums2.length <= 104 +// -109 <= nums1[i], nums2[i] <= 109 +// nums1, nums2 均为升序排列 +// 1 <= k <= 1000 +// +// Related Topics 数组 堆(优先队列) +// 👍 199 👎 0 + +package leetcode.editor.cn; + +import javafx.util.Pair; + +import java.util.*; + +//373:查找和最小的K对数字 +class FindKPairsWithSmallestSums { + public static void main(String[] args) { + //测试代码 + Solution solution = new FindKPairsWithSmallestSums().new Solution(); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public List> kSmallestPairs(int[] nums1, int[] nums2, int k) { + Queue> queue = new PriorityQueue<>((v1, v2) -> + nums1[v1.getKey()] + nums2[v1.getValue()] - nums1[v2.getKey()] - nums2[v2.getValue()] + ); + for (int i = 0; i < nums1.length; i++) { + queue.add(new Pair<>(i, 0)); + } + List> result = new ArrayList<>(); + for (int i = 0; i < k && !queue.isEmpty(); i++) { + Pair pair = queue.poll(); + result.add(Arrays.asList(nums1[pair.getKey()], nums2[pair.getValue()])); + if (pair.getValue() + 1 < nums2.length) { + queue.add(new Pair<>(pair.getKey(), pair.getValue() + 1)); + } + } + return result; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.md b/src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.md new file mode 100644 index 0000000..3cab0d8 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindKPairsWithSmallestSums.md @@ -0,0 +1,45 @@ +

给定两个以升序排列的整数数组 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]
+
+ +

 

+ +

提示:

+ +
    +
  • 1 <= nums1.length, nums2.length <= 104
  • +
  • -109 <= nums1[i], nums2[i] <= 109
  • +
  • nums1, nums2 均为升序排列
  • +
  • 1 <= k <= 1000
  • +
+
Related Topics
  • 数组
  • 堆(优先队列)
  • \n
  • 👍 199
  • 👎 0
  • \ No newline at end of file