問題描述 :
給定兩個以公升序排列的整形陣列 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,5,7
解釋: 返回序列中的前 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
輸出: 2, 2
解釋: 返回序列中的前 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],所以輸出4, 5
解釋: 也可能序列中所有的數對都被返回:[1,3],[2,3]
輸入說明 :
首先輸入nums1的長度n,然後輸入n個整數
再輸入nums2的長度m,然後輸入m個整數
最後輸入k
輸出說明 :
按從小到大的順序輸出k對數字的和(注意:可能不足k對)
輸入範例 :
31 7 11
32 4 6
3輸出範例 :
3 5 7
/*
思路:自己維護乙個大頂堆,堆中加入pair,first是nums1中的元素,second是nums2中的元素
維護堆的大小是k,當堆中有k個元素時就比較堆頂的first+top與nums1[i]+nums2[j]的大小,如果前者大於後者
則前者出隊,後者入隊,堆中元素不足k個,則直接入隊。
最後得到res,並返回逆置後的res
*/#include
#include
#include
#include
#include
using
namespace std;
class
solution};
//大頂堆
vectorint>
>
ksmallestpairs
(vector<
int>
& nums1, vector<
int>
& nums2,
int k)
}else}}
while
(!pq.
empty()
)reverse
(res.
begin()
,res.
end())
;return res;}}
;int
main()
cin>>m;
for(
int i=
0; i) cin>>k;
vectorint>
> res=
solution()
.ksmallestpairs
(nums1,nums2,k)
;for
(int i=
0; isize()
; i++
)return0;
}
查詢和最小的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 輸出 ...
查詢和最小的K對數字
373.查詢和最小的k對數字 給定兩個以公升序排列的整形陣列 nums1 和 nums2,以及乙個整數 k。定義一對值 u,v 其中第乙個元素來自 nums1,第二個元素來自 nums2。找到和最小的 k 對數字 u1,v1 u2,v2 uk,vk 示例 1 輸入 nums1 1,7,11 nums...
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 輸出 ...