题解 | #三数之和#
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711?tpId=295&tqId=731&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
C语言
//从小排到大
void sort(int *num, int numLen){
int temp;
for(int i=0; i<numLen; i++){
for(int j=i; j<numLen; j++){
if(num[j] < num[i]){
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
}
int** threeSum(int* num, int numLen, int* returnSize, int** returnColumnSizes ) {
// write code here
int a,bindex,cindex;
int** retArray = (int**)malloc(sizeof(int*)*numLen*numLen);
*returnColumnSizes = (int*)malloc(sizeof(int)*numLen*numLen);
// int (*retColSize)[1] = (int (*)[1])returnColumnSizes; //该参数一直调不过
// int retArray[5][3] = {0}; //本地测试
sort(num, numLen);
for(int i=0; i<numLen; i++){//从数组头开始遍历a
a = num[i];
bindex = i+1, cindex = numLen-1; //更新bc索引
if(a>0)break; //如果a大于0,此时由于已经升序排列,bc不满足+a等于0,退出循环
//双指针
while(bindex < cindex){ //如果左指针b 大于 右指针c, 则退出
if(a*(-1) < (num[bindex] + num[cindex])) //-a < b+c :大边缩小
cindex--;
else if(a*(-1) > (num[bindex] + num[cindex])) //-a > b+c: 小边增大
bindex++;
else{ //-a = b+c
retArray[(*returnSize)] = (int*)malloc(sizeof(int)*3); //动态申请装该结果的空间
// *(*(returnColumnSizes+(*returnSize))) = 3;
(*returnColumnSizes)[(*returnSize)] = 3;
retArray[(*returnSize)][0] = a; //将abc装入返回数组,此时已经是升序排列
retArray[(*returnSize)][1] = num[bindex];
retArray[(*returnSize)][2] = num[cindex];
(*returnSize)++; //返回数组行数+1
while(num[cindex] == num[cindex-1]) //如果大边多个元素连续相同,跳到上一个不同元素
cindex--;
cindex--;
}
}
//如果有多个元素连续相同,直接跳到下一个不同元素
while(a == num[i+1])
i++;
}
// for(int i=0; i<(*returnSize); i++)
// printf("\r\n ret[%d]: %d %d %d", i, retArray[i][0], retArray[i][1], retArray[i][2]);
return retArray;
}

