前面已经做了2sum,3sum之类的了,其实这些t-sum都可以归纳为O(n-1 ^ (t-1))复杂度。先排序,
这个是比较通用的代码,80ms;
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector< vector<int> > result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i)
{
for (int j = i + 1; j < nums.size(); ++j)
{
int temp = target - nums[i] - nums[j], m = j + 1, n = nums.size() - 1;
while (m < n)
{
if (nums[m] + nums[n] < temp)
++m;
else if (nums[m] + nums[n] > temp)
--n;
else
{
result.push_back({ nums[i], nums[j], nums[m], nums[n] });
++m;
while (m < n && nums[m - 1] == nums[m]) ++m;
--n;
while (m < n && nums[n + 1] == nums[n]) --n;
}
}
while (j + 1 < nums.size() && nums[j + 1] == nums[j]) ++j;
}
while (i + 1 < nums.size() && nums[i + 1] == nums[i]) ++i;
}
return result;
}
这个是直接查找,可以不用考虑中间重复的情况
vector<vector<int>> fourSum(vector<int>& nums, int target) {
if(nums.size() < 4) return {};
vector< vector<int> > result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 3; ++i)
for (int j = i + 1; j < nums.size() - 2; ++j)
{
int temp = target - nums[i] - nums[j], m = j + 1, n = nums.size() - 1;
while (m < n)
{
if (nums[m] + nums[n] < temp)
++m;
else if (nums[m] + nums[n] > temp)
--n;
else
{
vector<int> itemp({ nums[i], nums[j], nums[m], nums[n] });
if (find(result.begin(), result.end(), itemp) == result.end())
result.push_back({ nums[i], nums[j], nums[m], nums[n] });
++m;
--n;
}
}
}
return result;
}