三数之和
举一反三
class Solution
{
public:
vector<vector<int>> fourSum(vector<int> &nums, int target)
{
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
int first = 0, n = nums.size();
while (first < n)
{
int second = first + 1;
while (second < n)
{
int left = second + 1, right = n - 1;
long long aim = (long long)target - nums[first] - nums[second];
while (left < right)
{
int sum = nums[left] + nums[right];
if (sum < aim)
left++;
else if (sum > aim)
right--;
else
{
ret.push_back({nums[first], nums[second], nums[left++], nums[right--]});
while (left < right && nums[left] == nums[left - 1])
left++;
while (left < right && nums[right] == nums[right + 1])
right--;
}
}
second++;
while (second < n && nums[second] == nums[second - 1])
second++;
}
first++;
while (first < n && nums[first] == nums[first - 1])
first++;
}
return ret;
}
};
溢出问题
2的31次方:21 4748 3648
int能表示的范围:- 2^31 ~ 2^31-1 即
- 21 4748 3648 ~~ 21 4748 3647
10的9次方:10 0000 0000
20的9次方:20 0000 0000
- nums中的值最大为10 ^9,最小为-10 ^9
int型的sum可以容纳两个 +10 ^9或-10 ^9 - target - 20 ^9 或 target + 20 ^9 会超过int范围!