题目描述:373. 查找和最小的 K 对数字
直观的思路是每一个结点都向右侧和下侧扩展,但是这种方案会引起重复。
修正后的方案是将第一列结点添加入heap中后,每次取数据后只向右侧进行扩展。
cpp
class Solution {
public:
struct node
{
int val;
int x, y;
// 取巧定义比较函数
bool operator < (const node& other) const
{
return val > other.val;
}
};
node Add(int val, int x, int y)
{
return node{ val, x, y };
}
// K对最小数组
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k)
{
// 默认为大顶堆,但是定义特殊比较函数,因此为小顶堆
priority_queue<node> q;
vector<vector<int>> ans;
int n, m;
n = nums1.size(); m = nums2.size();
for (int i = 0; i < min(k, n); i++)
{
q.push(Add(nums1[i]+nums2[0], i, 0));
}
while (!q.empty() && k)
{
node tmp = q.top(); q.pop();
k--;
int x, y;
x = tmp.x, y = tmp.y;
ans.push_back({nums1[x], nums2[y]});
// 只进行向右侧进行扩展
if(y < m-1)
q.push(Add(nums1[x] + nums2[y + 1], x, y + 1));
}
return ans;
}
};