您好,登錄后才能下訂單哦!
給你一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?請(qǐng)你找出所有滿足條件且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組。
示例:
給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
/*
author: xidoublestar
date: 2020-5-21
*/
int compare(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
//排除平臺(tái)只輸出]的bug
*returnSize = 0;
//排除輸入小于3的情況
if (numsSize < 3)
return NULL;
//使用qsort函數(shù)快速排序
qsort(nums, numsSize, sizeof(int), compare);
//申請(qǐng)二級(jí)指針空間
int** returnArray = (int**)malloc(sizeof(int*) * (numsSize - 2) * (numsSize - 2));
//申請(qǐng)每個(gè)一維數(shù)組大小的空間
*returnColumnSizes = (int*)malloc(sizeof(int) * (numsSize - 2) * (numsSize - 2));
int cur = 0, low = 0,high = 0;
//cur遍歷數(shù)組,low和high分別做為左值和右值的下標(biāo)往中間夾
while (nums[cur] <= 0 && cur < numsSize - 2) {
low = cur + 1;
high = numsSize - 1;
while (low < high) {
if (0 == (nums[cur] + nums[low] + nums[high])) {
returnArray[*returnSize] = (int*)malloc(sizeof(int) * 3);//每找到一組,二級(jí)指針分配3個(gè)空間
(*returnColumnSizes)[*returnSize] = 3;//記錄列數(shù)
returnArray[*returnSize][0] = nums[cur];
returnArray[*returnSize][1] = nums[low];
returnArray[(*returnSize)++][2] = nums[high];
while ((nums[low] == nums[++low]) && (low < high));//往后去重
while ((nums[high] == nums[--high]) && (low < high));//往前去重
}
else if (0 < (nums[cur] + nums[low] + nums[high])) {
high--;
}
else {
low++;
}
}
while ((nums[cur] == nums[++cur]) && (cur < numsSize - 2));//cur左值去重
}
return returnArray;
}
時(shí)間復(fù)雜度:O(n*n)
空間復(fù)雜度:O(1)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。