
链接:
固定num2,想象为多个数组合并
https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/description/https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/description/?envType=study-plan-v2&envId=top-interview-150
cpp
class Solution {
public:
struct Node {
int i; // nums1的索引
int j; // nums2的索引
int sum; // 缓存和值,避免重复计算
Node(int row, int col, int s) : i(row), j(col), sum(s) {}
bool operator<(const Node& a) const {
return sum > a.sum; // 最小堆
}
};
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
if (nums1.empty() || nums2.empty() || k <= 0) return {};
priority_queue<Node> que;
// 初始化:将nums1中前min(k, nums1.size())个元素与nums2[0]配对
for (int i = 0; i < min(k, (int)nums1.size()); ++i) {
que.push(Node(i, 0, nums1[i] + nums2[0]));
}
vector<vector<int>> result;
while (k-- > 0 && !que.empty()) {
Node curr = que.top();
que.pop();
result.push_back({nums1[curr.i], nums2[curr.j]});
// 将同一行的下一个元素加入堆
if (curr.j + 1 < nums2.size()) {
que.push(Node(curr.i, curr.j + 1, nums1[curr.i] + nums2[curr.j + 1]));
}
}
return result;
}
};