C语言版本
这题和三数之和原理一样,但是值得注意的是我这把首先申请内存的时候,如果按照最大内存申请,程序显示超时,改成size=1000,就能通过。说明内存申请上面也是可以优化的。
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int compare(const void * a, const void * b)
{
return (*(int *)a - *(int *)b);
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize) {
qsort(nums,numsSize,sizeof(int),compare);
int num=0;
int **res=NULL;
//int size = numsSize*(numsSize-1)*(numsSize-2)*(numsSize-3)/24;
int size = 1000;
res = (int**)malloc(sizeof(int *)*size);
for (int i =0; i<size;i++)
{
res[i] = (int *)malloc(sizeof(int)*4);
}
for(int i = 0;i<numsSize-3;i++)
{
if(i>0 && nums[i]==nums[i-1])continue;
for(int j =i+1;j<numsSize-2;j++)
{
if(j>i+1&&nums[j]==nums[j-1]) continue;
int start = j+1;
int end = numsSize-1;
while(start<end)
{
int sum = nums[i]+nums[j]+nums[start]+nums[end];
if(sum == target)
{
res[num][0]=nums[i];
res[num][1]=nums[j];
res[num][2]=nums[start];
res[num][3]=nums[end];
num++;
start++;
end--;
while(start<end && nums[start]==nums[start-1])start++;
while(start<end && nums[end]==nums[end+1])end--;
}
else if(sum<target)
{
start++;
while(start<end && nums[start]==nums[start-1])start++;
}
else
{
end--;
while(start<end && nums[end]==nums[end+1])end--;
}
}
}
}
*returnSize = num;
return res;
}
其他人的版本
int cmp (const void *a, const void *b){
return *(int *)a - *(int *)b;
}
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int** fourSum(int* nums, int numsSize, int target, int* returnSize) {
if (nums == NULL || returnSize == NULL ||numsSize < 4) return NULL;
int **ret = NULL;
qsort (nums, numsSize, sizeof (int), cmp);
int sum, i, j, l, r;
*returnSize = 0;
for (i = 0; i < numsSize - 3; i++){
if (i > 0 && nums[i] == nums[i - 1]) continue;
for (j = i + 1; j < numsSize - 2; j++){
if (j > i + 1 && nums[j] == nums[j-1]) continue;
l = j + 1, r = numsSize - 1;
if (nums[i] + nums[j] + nums[r - 1] + nums[r] < target) continue;
if (nums[i] + nums[j] + nums[l] + nums[l + 1] > target) break;
while (l < r){
sum = nums[i] + nums[j] + nums[l] + nums[r];
if (sum == target){
if (*returnSize &&
(ret[*returnSize - 1][0] == nums[i]
&& ret[*returnSize - 1][1] == nums[j]
&& ret[*returnSize - 1][2] == nums[l]))
{
l++;
r--;
continue;
}
if ((*returnSize) % 100 == 0)
ret = realloc (ret, sizeof (int *) * (*returnSize + 100));
ret[*returnSize] = malloc (sizeof (int) * 4);
ret[*returnSize][0] = nums[i];
ret[*returnSize][1] = nums[j];
ret[*returnSize][2] = nums[l];
ret[*returnSize][3] = nums[r];
*returnSize = *returnSize + 1;
l++;
r--;
}
else if (sum > target)
r--;
else
l++;
}
}
}
return ret;
}
C++版本
class Solution {
public:
vector<vector<int>> fourSum(vector<int> &nums, int target) {
vector<vector<int>> res;
int n = nums.size();
sort(nums.begin(), nums.end());
for (int i = 0; i < n - 3; ++i) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
for (int j = i + 1; j < n - 2; ++j) {
if (j > i + 1 && nums[j] == nums[j - 1]) continue;
int left = j + 1, right = n - 1;
while (left < right) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
vector<int> out{nums[i], nums[j], nums[left], nums[right]};
res.push_back(out);
while (left < right && nums[left] == nums[left + 1]) ++left;
while (left < right && nums[right] == nums[right - 1]) --right;
++left; --right;
} else if (sum < target) ++left;
else --right;
}
}
}
return res;
}
};