3sum:
给一个数组,找出数组中所有三个数的和等于target的数,每组数按非降序排列
vector<vector<int>> res;
vector<vector<int>> three_sum(vector<int>& data, int target)
{
int length = data.size();
if (length < 3) return res;
sort(data.begin(), data.end());
for (int k = 0; k < length - 2; k++)
{
if (k > 0 && data[k] == data[k - 1]) continue;
int start = k + 1;
int end = length - 1;
int temp = target - data[k];
while (start < end)
{
if (data[start] + data[end] == temp)
{
res.push_back({ data[k],data[start],data[end] });
while (start < end&&data[start] == data[start + 1]) start++;
while (start < end&&data[end] == data[end - 1]) end--;
start++;
end--;
}
else if (data[start] + data[end] < temp)
{
start++;
}
else end--;
}
}
return res;
}
3sum closest:
给一个数组,找出数组中三个数的和最接近target的数,每组数按非降序排列
int three_sum_closest(vector<int> data, int target)
{
int length = data.size();
if (length < 3) return -1;
int res = data[0] + data[1] + data[length - 1];
sort(data.begin(), data.end());
for (int k = 0; k < length - 2; k++)
{
int start = k + 1;
int end = length - 1;
while (start < end)
{
int cur = data[k] + data[start] + data[end];
if (cur < target) start++;
else end--;
if (abs(cur - target) < abs(res - target))
{
res = cur;
}
}
}
return res;
}
4sum:
给一个数组,找出数组中所有四个数的和等于target的数,每组数按照非降序排列
vector<vector<int>> foursum(vector<int> data, int target)
{
vector<vector<int>> res;
int length = data.size();
if (length < 4) return res;
sort(data.begin(), data.end());
for (int i = 0; i < length - 3; i++)
{
if (i > 0 && data[i] == data[i - 1]) continue;
if (data[i] + data[i + 1] + data[i + 2] + data[i + 3] > target) break;
if (data[i] + data[length - 3] + data[length - 2] + data[length - 1] < target) continue;
for (int j = i + 1; j < length - 2; j++)
{
if (j > i + 1 && data[j] == data[j - 1]) continue;
if (data[i] + data[j] + data[j + 1] + data[j + 2] > target) break;
if (data[i] + data[j] + data[length - 2] + data[length - 1] < target) continue;
int start = j + 1;
int end = length - 1;
int temp = target - data[i] - data[j];
while (start < end)
{
if (data[start] + data[end] == temp)
{
res.push_back({ data[i],data[j],data[start],data[end] });
while (start < end&&data[start] == data[start + 1]) start++;
while (start < end&&data[end] == data[end - 1]) end--;
start++;
end--;
}
else if (data[start] + data[end] < temp) start++;
else end--;
}
}
}
return res;
}