leetcode_373 Find K Pairs with Smallest Sums
2016-08-29 19:30
357 查看
题目分析
给定两个递增的数组,从每个数组中任意取出一个数来组成不同的数字对,求前k个最小的数字对。
解题思路:
方法1 利用暴力求解法;
方法2 借助STL中的multimap实现;
方法3 借助STL中的priority_queue实现。
实现程序
参考文献
http://www.cnblogs.com/grandyang/p/5653127.html
给定两个递增的数组,从每个数组中任意取出一个数来组成不同的数字对,求前k个最小的数字对。
解题思路:
方法1 利用暴力求解法;
方法2 借助STL中的multimap实现;
方法3 借助STL中的priority_queue实现。
实现程序
static bool cmp(pair<int, int> a, pair<int, int> b) { if (a.first + a.second < b.first + b.second) return true; return false; } // 方法1 暴力求解 vector< pair<int, int> > kSmallestPairs1(vector<int>& nums1, vector<int>& nums2, int k) { vector< pair<int, int> > result; int size1 = (int)nums1.size(); int size2 = (int)nums2.size(); if (size1 <= 0 || size2 <= 0) return result; for (int i = 0; i < min(size1, k); i++) { for (int j = 0; j < min(size2, k); j++) { result.push_back(make_pair(nums1[i], nums2[j])); } } // 对生成的结果进行排序 sort(result.begin(), result.end(), cmp); // 删除重复的元素 if (result.size() > k) result.erase(result.begin() + k, result.end()); return result; } // 方法2 借助multimap实现 vector< pair<int, int> > kSmallestPairs2(vector<int>& nums1, vector<int>& nums2, int k) { vector< pair<int, int> > result; int size1 = nums1.size(); int size2 = nums2.size(); if (size1 <= 0 || size2 <= 0 || k <= 0) return result; multimap< int, pair<int, int> > mul; for (int i = 0; i < min(size1, k); i++) { for (int j = 0; j < min(size2, k); j++) { int temp = nums1[i] + nums2[j]; mul.insert(make_pair(temp, make_pair(nums1[i], nums2[j]))); } } // 取出前k个元素 multimap< int, pair<int, int> >::iterator it; for (it = mul.begin(); it != mul.end(); it++) { result.push_back(it->second); k--; if (k <= 0) return result; } return result; } // 方法3:借助priority_queue实现 struct cmp1 { bool operator()(pair<int, int> a, pair<int, int> b) { return a.first + a.second < b.first + b.second; } }; vector< pair<int, int> > kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { vector< pair<int, int> > result; int size1 = nums1.size(); int size2 = nums2.size(); if (size1 <= 0 || size2 <= 0 || k <= 0) return result; priority_queue< pair<int, int>, vector< pair<int, int> >, cmp1> que; for (int i = 0; i < min(size1, k); i++) { for (int j = 0; j < min(size2, k); j++) { if (que.size() < k) { que.push(make_pair(nums1[i], nums2[j])); } else { if (nums1[i] + nums2[j] < que.top().first + que.top().second) { que.push(make_pair(nums1[i], nums2[j])); que.pop(); } } } } while (!que.empty()) { result.push_back(que.top()); que.pop(); } return result; }
参考文献
http://www.cnblogs.com/grandyang/p/5653127.html
相关文章推荐
- LeetCode[373] Find K Pairs with Smallest Sums
- Leetcode 373 Find K Pairs with Smallest Sums
- [LeetCode] 373. Find K Pairs with Smallest Sums 找和最小的K对数字
- leetcode:heap:Find K Pairs with Smallest Sums(373)
- [leetcode-373]Find K Pairs with Smallest Sums(java)
- [leetcode]373. Find K Pairs with Smallest Sums -- JavaScript代码
- [leetcode] 373. Find K Pairs with Smallest Sums 解题报告
- Leetcode373: Find K Pairs with Smallest Sums
- leetcode 373. Find K Pairs with Smallest Sums 暴力循环求解
- LeetCode 373 Find K Pairs with Smallest Sums
- leetcode 373 Find K Pairs with Smallest Sums java
- [Leetcode] 373. Find K Pairs with Smallest Sums 解题报告
- leetcode 373. Find K Pairs with Smallest Sums 优先队列
- 373. Find K Pairs with Smallest Sums
- 373. Find K Pairs with Smallest Sums
- 373. Find K Pairs with Smallest Sums && 378. Kth Smallest Element in a Sorted Matrix
- 373. Find K Pairs with Smallest Sums
- Find K Pairs with Smallest Sums -- LeetCode
- 373. Find K Pairs with Smallest Sums
- 373. Find K Pairs with Smallest Sums