15 查詢和最小的K對數字

2021-10-09 11:03:36 字數 1865 閱讀 8272

問題描述 :

給定兩個以公升序排列的整形陣列 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 輸出 ...