給定兩個以公升序排列的整數陣列 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
根據提示,nums1和nums2陣列的規模很大,所以全部求出所有數對的方法肯定第乙個被否定,並且也沒有必要求出所有的數對。
基本思路是使用記憶化的方法,將nums2中與nums1中配對的下標記錄下來,減少重複計算。
從題目中可以得知,nums1和nums2都已經經過公升序排序,那麼對於最初情況來說,nums1[0] + nums2[0]必定為最小的數,對於第二小的數來說,他的候選最小數為num1[0] + nums2[1] 或者 nums1[1] + nums[2]。對於一般情況第k小的數,他的候選數為nums1[0] + nums2[i0]、nums1[1] + nums2[i1]、nums1[2] + nums2[i2]……nums1[j] + nums2[ij]、nums1[j + 1] + nums2[0],其中j是之前遍歷訪問過的num1的下標最大值,ij 是對於nums2中未與nums1[i]配對過的下標最小值,這裡可以用乙個vector來記錄。由於nums2是公升序的,所以nums1[j + 1] + nums2[0] 肯定比 nums1[j + m] + nums2[n] 小,之後的數肯定不屬於第k個最小數。
Leetcode 373 查詢和最小的K對數字
給定兩個以公升序排列的整形陣列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...
373 查詢和最小的K對數字
給定兩個以公升序排列的整形陣列 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 輸出 ...
373 查詢和最小的K對數字
題目描述 給定兩個以公升序排列的整形陣列 nums1 和 nums2,以及乙個整數 k。定義一對值 u,v 其中第乙個元素來自 nums1,第二個元素來自 nums2。找到和最小的 k 對數字 u1,v1 u2,v2 uk,vk 示例 1 輸入 nums1 1,7,11 nums2 2,4,6 k ...