题目描述
You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k.
Define a pair (u,v) which consists of one element from the first array and one element from the second array.
Find the k pairs (u1,v1),(u2,v2) ...(uk,vk) with the smallest sums.
题目大意
从两个给定的整数数组中依次取出两个数字求和,求能够取出的前k小的数对的和,将数对存入结果当中。
示例
E1
E2
E3
解题思路
简单利用数据结构 map<int, set<pair<int,int>>> ,遍历所有的数对可能性,取出前k个作为结果即可(map会自动按照第一个主参数排序)。
复杂度分析
时间复杂度:O(M * N)
空间复杂度:O(M * N)
代码
class Solution { public: vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { map<int, multiset<pair<int, int> > > pairSum; // 遍历所有可能的数对,保存数对以及它们的和 for(int j = 0; j < nums2.size(); ++j) { for(int i = 0; i < nums1.size(); ++i) { pairSum[nums1[i] + nums2[j]].insert(make_pair(nums1[i], nums2[j])); } } vector<vector<int> > res; // 取出上述保存的前k个数对 for(auto iter = pairSum.begin(); iter != pairSum.end(); ++iter) { for(auto it = iter->second.begin(); it != iter->second.end(); ++it) { if(res.size() >= k) break; vector<int> tmp; tmp.push_back(it->first); tmp.push_back(it->second); res.push_back(tmp); } if(res.size() >= k) break; } return res; } };