leetcode18 四数之和 C语言实现

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 //两个for循环 头 尾
int comp(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes)
{
	qsort(nums, numsSize, sizeof(int), comp);
	*returnSize = 0;
	int n;
	int** t = NULL;
	t = (int**)malloc(sizeof(int*) * 200);
	if (numsSize < 4)
	{
		return t;
	}

	for (int i = 0; i < numsSize - 3; i++)
	{
		if (i != 0 && nums[i] == nums[i - 1])
			continue;
		for (int j = numsSize - 1; j > i + 2; j--)
		{
			if (j != numsSize - 1 && nums[j] == nums[j + 1])
				continue;
			for (int m = i + 1, n = j - 1; m < n;)
			{
				if (m != i + 1 && nums[m] == nums[m - 1])
				{
					m++;//去重的时候容易把这行忘记
					continue;
				}
				if (n != j - 1 && nums[n] == nums[n + 1])
				{
					n--;
					continue;
				}
				
				if ((long)nums[i] + nums[j] + nums[m] + nums[n] > target)//之前迷糊了还是咋了,居然把target写成了0 还有注意这个long的强制类型转换
				{
					n--;
				}
				else if ((long)nums[i] + nums[j] + nums[m] + nums[n] < target)
				{
					m++;
				}
				else
				{
					t[*returnSize] = (int*)malloc(sizeof(int) * 4);
					t[*returnSize][0] = nums[i];
					t[*returnSize][1] = nums[m];
					t[*returnSize][2] = nums[n];
					t[*returnSize][3] = nums[j];
					(*returnSize)++;//注意不能忘记括号
					m++;
					n--;
				}
			}
		}
	}
	*returnColumnSizes = (int*)malloc(sizeof(int) * (*returnSize));
	for (int i = 0; i < *returnSize; i++)
	{
		//returnColumnSizes[0][i] = 4;
		(*returnColumnSizes)[i] = 4;
	}
	return t;
}

你可能感兴趣的:(leetcode,c语言)