Leetcode 373.查找和最小的k对数字

查找和最小的k对数字

给定两个以升序排列的整形数组 nums1nums2, 以及一个整数 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 import java.util.*;
 2 public class Solution {
 3     public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
 4         List<int[]> res = new LinkedList<>();
 5         Queue<int[]> queue = new PriorityQueue<>(k,new Comparator<int[]>(){
 6             public int compare(int[] o1, int[] o2){
 7                 int tmp1 = o1[0]+o1[1];
 8                 int tmp2 = o2[0]+o2[1];
 9                 return tmp1 - tmp2;
10             }
11         });
12         for(int i = 0; i<nums1.length; i++){
13             for(int j = 0; j<nums2.length; j++){
14                 queue.add(new int[]{nums1[i],nums2[j]});
15             }
16         }
17         while(k-->0){
18             int[] tmp = queue.poll();
19             if(tmp == null) break;
20             res.add(tmp);
21         }
22         return res;
23     }
24 }

猜你喜欢

转载自www.cnblogs.com/kexinxin/p/10235326.html