/**
* 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().
*/
//int *returnsize 后一个双指针 是为了改变传入的指针 返回一个双指针类似char **str
/*
*/
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b; //由小到大排序
//return *(int *)b - *(int *)a; 由大到小排序
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int left,right;
int i=0;
int **res =(int **)malloc(sizeof(int *)*20000);//空间不够
int sum;
*returnSize =0;
//小鱼3个直接反回
if(numsSize<3) return res;
qsort(nums,numsSize,sizeof(nums[0]),cmp);
for(i=0;i<numsSize-2;i++)
{
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;//i>0去重!!!
left=i+1;
right =numsSize-1;
while(left<right)
{
sum=nums[i]+nums[left]+nums[right];
if(sum==0)
{
int *arr =(int *) malloc(sizeof(int)*3);
// -3 -1 -1 -1 -1 -1 -1 4 4 4 4
arr[0]=nums[i];
arr[1]=nums[left];
arr[2]=nums[right];
res[(*returnSize)++] =arr;
while((left<right) && (nums[right] == nums[right-1])) right--;
while((left<right) && (nums[left] == nums[left+1])) left++;
//双移动是因为动一个肯定会跳转到不为0的直接同时动就行了
left++;
right--;
printf("%d %d \n",left, right);
}
else if(sum<0) left++;
else right--;
}
}
*returnColumnSizes = (int*)malloc(sizeof(int) * (*returnSize));//几次了!!!!!!!!
for(i=0;i<(*returnSize);i++) {(*returnColumnSizes)[i] =3;}
return res;
}
Leecode15 三数之和
最新推荐文章于 2024-07-19 15:45:46 发布