我从here获得以下代码。
class Solution {
public:
vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
vector<pair<int,int>> result;
if (nums1.empty() || nums2.empty() || k <= 0)
return result;
auto comp = [&nums1, &nums2](pair<int, int> a, pair<int, int> b) {
return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> min_heap(comp);
min_heap.emplace(0, 0);
while(k-- > 0 && min_heap.size())
{
auto idx_pair = min_heap.top(); min_heap.pop();
result.emplace_back(nums1[idx_pair.first], nums2[idx_pair.second]);
if (idx_pair.first + 1 < nums1.size())
min_heap.emplace(idx_pair.first + 1, idx_pair.second);
if (idx_pair.first == 0 && idx_pair.second + 1 < nums2.size())
min_heap.emplace(idx_pair.first, idx_pair.second + 1);
}
return result;
}
};
lambda表达式有一行用于实现比较器:
auto comp = [&nums1, &nums2](pair<int, int> a, pair<int, int> b) {
return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];};
pair.first
索引第一个数组nums1
,而pair.second
索引第二个数组nums2
。
该比较器比较两对,其中每对包含两个数组(向量)的索引。如果第一对(array1 [first_pair.first] + array2 [first_pair.second])具有大于第二对的相应数组和,则表达式返回true。
我的问题是,我们可以使用结构来实现相同的比较器吗?困难的部分是如何将两个数组作为参数传递给比较器。
比较两对(不是两个数组的索引)的结构可以用这种方式实现:
struct myCompare {
bool operator() (const pair<int,int> lhs, const pair<int,int> rhs) const
{ return (lhs.first+lhs.second < rhs.first+rhs.second); }
};
但这是比较两个条目的总和。现在我们要比较两对索引的两个数组条目的总和。
答案 0 :(得分:1)
您可以在比较器的构造函数中传递数组。
Error in pie(data1) : 'x' values must be positive
然后使用它:
struct myCompare {
// pass capture variables using constructor
myCompare(const std::vector<int>& nums1, std::vector<int>& nums2)
: nums1(nums1), nums2(nums2) {}
bool operator() (const pair<int,int> lhs, const pair<int,int> rhs) const
{ return (nums1[lhs.first] + nums2[lhs.second] < nums1[rhs.first] + nums2[rhs.second]); }
private:
const std::vector<int>& nums1;
const std::vector<int>& nums2;
};
答案 1 :(得分:0)
将比较器与构造函数一起使用。见下文。注意,我们通过const引用传递构造函数和操作符参数。
struct MyCompare
{
MyCompare(const vector<int>& arOne, const vector<int>& arTwo)
: nums1(arOne), nums2(arTwo)
{}
bool operator() (const pair<int,int>& lhs, const pair<int,int>& rhs) const
{
return nums1[lhs.first] + nums2[lhs.second]
> nums1[rhs.first] + nums2[rhs.second];
}
const vector<int>& nums1;
const vector<int>& nums2;
};
//定义如下
std::priority_queue<pair<int, int>, vector<pair<int, int> >, MyCompare>
min_heap(MyCompare(arOne, arTwo));