难度中等20
设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。
示例 1:
输入: nums = [5,6,5], target = 11
输出: [[5,6]]
示例 2:
输入: nums = [5,6,5,6], target = 11
输出: [[5,6],[5,6]]
提示:
nums.length <= 100000
class Solution {
public:
int mylower_find(vector<int>& nums, int l, int r, int target) {
while (l < r) {
int mid = (l + r) >> 1;
if (nums[mid] >= target)
r = mid;
else
l = mid + 1;
}
return l;
}
int myupper_find(vector<int>& nums, int l, int r, int target) {
while (l < r) {
int mid = (l + r) >> 1;
if (nums[mid] > target)
r = mid;
else
l = mid + 1;
}
return l;
}
vector<vector<int>> pairSums(vector<int>& nums, int target) {
vector<vector<int>>res;
if (nums.size() == 0)
return res;
vector<bool>flag(nums.size(), 1);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; ++i) {
int l = i + 1, r = nums.size();
if (flag[i] == 0)
continue;
l = mylower_find(nums, l, r, target - nums[i]);
if (nums[l] == target - nums[i]) {
int j = 0;
while (l + j < nums.size() && nums[l + j] == target - nums[i] && flag[l + j] == 0)
j++;
if (l + j < nums.size() && nums[l + j] == target - nums[i] && flag[l + j]) {
vector<int>s(2);
s[0] = nums[i];
s[1] = nums[l + j];
//cout << s[0] << ' '<<s[1] <<endl;
flag[l + j] = 0;
res.push_back(s);
}
}
}
return res;
}
};