面试题 16.24. 数对和(自定义二分)

面试题 16.24. 数对和

难度中等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;
	}
};

猜你喜欢

转载自blog.csdn.net/Yanpr919/article/details/114442542