#include<stdio.h>
#include<stdlib.h>
int** threeSum(int* nums, int numsSize, int* returnSize)
{
if (numsSize<3)
return NULL;
int comNum = numsSize*(numsSize - 1)*(numsSize - 2) / 6;
int** ret = (int**)malloc(sizeof(int*)*comNum);//先创建“用来存储一堆指针的”空间
int** tmp = ret;
int realcomNum = 0;
for (int i = 0; i < numsSize - 2; i++)
{
for (int j = i+1; j < numsSize - 1; j++)
{
for (int k = j+1; k < numsSize; k++)
{
if (0 == nums[i] + nums[j] + nums[k])
{
*tmp = (int *)malloc(sizeof(int) * 3);//再把里面的指针,指向所分配空间
*(*(tmp)) = nums[i];
*(*(tmp)+1) = nums[j];
*(*(tmp)+2) = nums[k];
tmp = tmp + 1;
realcomNum = realcomNum + 1;
}
}
}
}
//注意这里面的写法,很有借鉴意义。对二级指针的运用很有启发,而且可以扩展到更高级指针。
int** retReal = (int **)malloc(sizeof(int*)*realcomNum);
for (int h = 0; h<realcomNum; h++)
{
retReal[h] = tmp[h];//这里写成ret[h]才行
}
free(ret);
*returnSize = realcomNum;
return retReal;
}
int main(void)//这份代码并不能完成题目要求的不能重复的要求。只是熟悉指针操作而已。
{
int array[] = { 1,0,0,0,-1};
int comnum=0;
int** p = NULL;
p = threeSum(array, sizeof(array) / sizeof(array[0]), &comnum);
printf("共有%d个组合:\n",comnum);
for (int n = 0; n <comnum; n++)
{
printf("[%d,%d,%d]\n", *(p[n]+0), *(p[n] + 1), *(p[n] + 2));
free(p[n]);
}
free(p);
p = NULL;
getchar();
return 0;
}
leetcode——15.3Sum
最新推荐文章于 2023-04-25 15:59:23 发布