1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { vector<int> kSmallestPairs(const vector<int>& nums1, const vector<int>& nums2, int k) { if (nums1.empty() || nums2.empty() || k == 0) return {}; using pii = pair<int, int>; auto cmp = [&nums1, &nums2](const pii &a, const pii &b) { return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second]; }; priority_queue<pii, vector<pii>, decltype(cmp)> q(cmp); int m = nums1.size(), n = nums2.size(); for (int j = 0, sz = min(k, n); j < sz; ++j) { q.emplace(0, j); } vector<int> res; while (k-- > 0 && !q.empty()) { auto [i, j] = q.top(); q.pop(); res.push_back(nums1[i] + nums2[j]); if (i + 1 < m) { q.emplace(i + 1, j); } } return res; } public: int kthSmallest(vector<vector<int>>& mat, int k) { int m = mat.size(), n = min((int)mat[0].size(), k); vector<int> v(begin(mat[0]), begin(mat[0]) + n); for (int r = 1; r < m; ++r) { v = kSmallestPairs(v, mat[r], k); } return v.back(); } };
|