373. 查找和最小的 K 对数字Normal暴力穷举

Posted pre_eminent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了373. 查找和最小的 K 对数字Normal暴力穷举相关的知识,希望对你有一定的参考价值。

题目:

给定两个以 升序排列 的整数数组 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 <= 10^5
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1 和 nums2 均为升序排列
1 <= k <= 1000


思路1:暴力穷举

数组1,取前Math.min(nums1.length, k)个数,

数组2,取前Math.min(nums2.length, k)个数,

组合后排序,再取前min(ans.size(), k)个和,即为答案


解答:

/**
 * @param number[] nums1
 * @param number[] nums2
 * @param number k
 * @return number[][]
 */
var kSmallestPairs = function(nums1, nums2, k) 
    let objArr = [];
    let len1 = Math.min(nums1.length, k);
    let len2 = Math.min(nums2.length, k);
    for(let i = 0; i < len1; i++)
        for(let j = 0; j<len2; j++)
    		let obj = 
     	 	  x: nums1[i],
      	 	  y: nums2[j]
  			;
      	  objArr.push(obj);
        
    
    
    // 对对象数组进行排序
    objArr.sort((obj1, obj2)=>
        let sum1 = obj1.x + obj1.y;
        let sum2 = obj2.x + obj2.y;
        return sum1 - sum2;
    );
    
    let res = [];
    for(let i = 0; i < k; i++)
        let obj = objArr[i];
        if(obj)
           res.push([obj.x, obj.y]);
    	
    
    
    return res;
;

以上是关于373. 查找和最小的 K 对数字Normal暴力穷举的主要内容,如果未能解决你的问题,请参考以下文章

373 Find K Pairs with Smallest Sums 查找和最小的K对数字

⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字

⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字

Leetcode刷题100天—373. 查找和最小的K对数字(优先队列)—day17

LeetCode 334. 递增的三元子序列 / 747. 至少是其他数字两倍的最大数 / 373. 查找和最小的K对数字(多路归并滑动窗口+二分)

Top K问题详解