本题要点:
1:要通过一个函数改变一个数的值,就必须用一个指针,这意味要改变一个数组的值,就必须用一个二级指针。
2:认识c语言的qsort函数:【C语言】快速排序函数qsort()_zhangshuo的博客-CSDN博客_qsort函数c语言
3:对指针有更深入的认识。
int inc(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}//快排的一个步骤,暂时还不理解为什么这样做
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int i,j,k;
int **ans;
int spa=4;
*returnSize=0;//这个返回共有多少个组,一开始把它设为0;
ans=(int**)malloc(sizeof(int*)*spa);//给答案的一维数组开辟一个空间,先开辟一个小的空间,不够再加
*returnColumnSizes=(int*)malloc(sizeof(int)*spa);//ColumnSizes其实是一个一维数组,但是我们要改变它的值,所以设为了二维数组才能改变,但我们本质上要改变的还是一维数组,所以要加一个*
qsort(nums,numsSize,sizeof(int),inc);///<stdlib.h>里面的快速排序;
for(i=0;i<numsSize-2;i++){//设置一个定点,然后后面两个指针向中间靠
j=i+1;
k=numsSize-1;//初始化
if (i> 0 && nums[i] == nums[i - 1]) continue;//因为题目说了不能出现相同的一组,所以遇到相同的一定要跳过
while(j<k){
if(nums[i]+nums[j]+nums[k]==0){
ans[*returnSize]=(int*)malloc(sizeof(int)*3);//继续开辟空间,二级指针要开两个空间
ans[*returnSize][0]=nums[i];
ans[*returnSize][1]=nums[j];
ans[*returnSize][2]=nums[k];
(*returnColumnSizes)[*returnSize]=3;//因为每次固定是三个数,所以直接让它等于3
(*returnSize)++;
while(j<k&&nums[j]==nums[j+1])//检查是否会和后一个数相同,直到下个数不同位置,就变到下一个数之前的一个数
j++;
k--;//满足等于0的情况,两边指针都要动,还挺容易理解的
j++;
if(*returnSize==spa){
spa*=2;
ans=(int**)realloc(ans,sizeof(int*)*spa);
*returnColumnSizes=(int*)realloc((*returnColumnSizes),sizeof(int)*spa);
}//当空间不够就扩容,注意使用realloc函数,当指针一直在移动话就应该用malloc,暂时还没遇到那种题
}
else if(nums[i]+nums[j]+nums[k]>0)//其他情况了,这个好理解
k--;
else
j++;
}
}
return ans;
}
不断更改空间的值,用时和内存都不断在变化,而且变化还挺大的。
这个题花了几乎一天来完成 。