classSolution { private: longcount(vector<int>& nums1, vector<int>& nums2, int& mid){ // 只需 O(m+n) time, 因為 nums1 遞增, 若 i 變大, 則 j 變小 // 假設 i = 0 做完, j = 10 // 則 i = 1 時, j 從 10 繼續(pos 不用重設成 nums2.size() - 1) long cnt = 0; int j = nums2.size() - 1;
for (int i = 0; i < nums1.size(); ++i) { while (j >= 0 && nums1[i] + nums2[j] > mid) { --j; } cnt += (j + 1); }
return cnt; }
public: vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { long left = nums1[0] + nums2[0]; long right = nums1.back() + nums2.back();
while (left < right) { constint mid = left + (right - left) / 2;
if (count(nums1, nums2, mid) < k) { left = mid + 1; } else { right = mid; } }