这是一道典型的三数之和问题。
首先,你需要对数组进行排序,这样才能保证结果不重复。
然后,你可以使用双指针法来查找三数之和为 0 的三元组。
具体来说,假设你当前枚举到了数字 nums[i],你可以设置两个指针 left 和 right,分别指向 i+1 和数组末尾,然后不断移动指针来寻找满足条件的三元组。
这是一个示例代码:
``` /**
- Return an array of arrays of size *returnSize.
- Note: The returned array must be malloced, assume caller calls free().
/ int* threeSum(int* nums, int numsSize, int* returnSize) { int** res = malloc(sizeof(int*) * numsSize * numsSize); // 用于存储结果的数组 *returnSize = 0; // 用于记录结果数组中元素的个数
if (numsSize < 3) return res; // 如果数组长度小于 3,直接返回
qsort(nums, numsSize, sizeof(int), cmp); // 对数组进行排序
for (int i = 0; i < numsSize - 2; i++) {
// 如果当前数字与前一个数字相同,则跳过
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1, right = numsSize - 1; // 初始化 left 和 right 指针
while (left < right) {
int sum = nums[i] + nums[left] + nums[right]; // 计算三数之和
if (sum == 0) { // 如果等于 0,则找到了一组解
res[(*returnSize)++] = (int[]){n