考察的知识点:贪心;
解答方法分析:
- 定义了一个二维向量 res,用于存储结果。
- 声明一个最小堆 minHeap,用于存储每个可能的和的对,并按照和的大小进行排序。最小堆的大小始终为k,当超过k个和的对时,将会去掉最小的那个。
- 使用嵌套的循环遍历两个输入数组 pricesA 和 pricesB 的所有可能组合,并将它们的和以及对应的数组元素放入最小堆中。
- 每次从最小堆中取出一个和的对时,将它们的数组元素存入结果向量 res,并且计数器 count 加一。
- 当最小堆为空或者计数器 count 达到了k,结束循环,并返回结果向量 res。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pricesA int整型vector * @param pricesB int整型vector * @param k int整型 * @return int整型vector<vector<>> */ vector<vector<int> > kPairsWithLargestSums(vector<int>& pricesA, vector<int>& pricesB, int k) { int m = pricesA.size(); int n = pricesB.size(); vector<vector<int>> res; priority_queue<pair<int, pair<int, int>>> minHeap; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { minHeap.push(make_pair(pricesA[i] + pricesB[j], make_pair(pricesA[i], pricesB[j]))); } } int count = 0; while (!minHeap.empty() && count < k) { auto top = minHeap.top(); minHeap.pop(); int priceA = top.second.first; int priceB = top.second.second; res.push_back({priceA, priceB}); count++; } return res; } };