給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定陣列 nums =[-
1,0,
1,2,
-1,-
4],滿足要求的三元組集合為:[[
-1,0
,1],
[-1,
-1,2
]]
思路為:
當輸入size < 3 時,直接返回空
當輸入size >=3時,分配記憶體n * ( n-1 ) / 6
假設所有的數相加都等於0
,n
個數,每三個數一組,共有n-2 + n-3 + n-4 + ....+ 1
種情況,共n * ( n-1 ) / 2
種,但在這種情況下是不可能的。因為題目要求不可重複。
所以,取的值 比(size-1)*(size-2)/2
小就可以。
考慮到,當 輸出size 為 3 時,n * ( n-1 ) = 6
, 所以被除數最大為 6
所以此處,分配記憶體大小為n * ( n-1 ) / 6
設立三個指標,current, left, right
current 取值範圍為[0, size-2]
left 及 right 的取值範圍為[ current, size-2]
,left++
,right--
, 當left >= right
時該輪遍歷結束
排除一些錯誤解,由於 current 是最小的,right 是最大的
當current >=0
時,最終結果肯定 > 0
當right <=0
時,最終結果肯定 < 0
三個指標移動過程如下圖:
// 排序,從小到大排序, 雙向排序
void
sort_array
(int
*nums,
int numssize)
p++;}
left++
; right--;}
printf
("排序後:");
for(tmp =
0; tmp < numssize; tmp++
)printf
(" %3d "
, nums[tmp]);
printf
("\n");
}/**
* 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**
threesum
(int
* nums,
int numssize,
int* returnsize,
int*
* returncolumnsizes)
// 分配記憶體
returen_array =
(int**
)malloc
(sizeof
(int*)
*(numssize -1)
*(numssize )/6
);// 記錄陣列大小,array[i][j]中的 i
*returncolumnsizes =
(int*)
malloc
(sizeof
(int)*
(numssize -1)
*(numssize )/6
);// 記錄每個元素的大小,array[i][j]中的 j
// 對陣列進行排序
sort_array
(nums, numssize)
;// 思路就是 current,指向開頭,
current = nums;
while
(current < nums + numssize -2&&
*current <=0)
elseif(
*left +
*current +
*right <0)
else
}while(*
(++current)==*
(current-1)
&& current < nums + numssize -1)
;// current 去重
}return returen_array;
}
執行結果如下:
排序前: -10
12-1
-4 排序後: -4-
1-10
12 第 0 輪 current=-4
, left=-1
, right=2,
--*returensize=
0 第 0 輪 current=-4
, left=-1
, right=2,
--*returensize=
0 第 0 輪 current=-4
, left=
0, right=2,
--*returensize=
0 第 0 輪 current=-4
, left=
1, right=2,
--*returensize=
0 第 1 輪 current=-1
, left=-1
, right=2,
--*returensize=
0 第 1 輪 current=-1
, left=
0, right=1,
--*returensize=
1 第 3 輪 current=
0, left=
1, right=2,
--*returensize=
2 輸出: [[-
原因為列印的log 太多,此時注釋相關重複的printf log 即可。
LeetCode 15 三數之和
15.給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組 方法一,個人解法正確,但是效率太低,時間複雜度o n 3 時間超時,無法提交至leetcode public s...
leetcode 15 三數之和
給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class solutio...
leetcode15 三數之和
給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 先找兩數之和,然後再用un...