题目描述:Given an array
S
of
n
integers, are there elements
a
,
b
,
c
in
S
such that
a
+
b
+
c
= 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],A solution set is:[ [-1, 0, 1], [-1, -1, 2]]
分析:
1、3个数之和,先固定一个,再找两个数与这个数之和为0。
找两个数之和为一个目标数target方法:先将数组排序(数字可能重复),设置两个变量分别从数组的开头left和结尾right出开始搜索,若两个数之和sum和target相等,则保存,之后left++;right--;继续搜索(可能不唯一),知道left>=right;
如果sum<target,则left++;否则,right--。
2、考虑去重的问题
java代码实现:
public
class
Solution {
public
List
<
List
<
Integer
>>
threeSum(
int
[] nums) {
List
<
List
<
Integer
>>
res
=
new
ArrayList
<
List
<
Integer
>>
();
List
<
Integer
>
list;
int
len
=
nums.length;
Arrays.sort(nums);
if
(len
<
3
)
return
res;
for
(
int
i
=
0
;i
<
len;i
++
){
int
left
=
i
+1
;
int
right
=
len
-1
;
if
(i
>
0
&&
(nums[i]
==
nums[i
-1
]))
continue
;
while
(left
<
right){
int
sum
=
nums[i]
+
nums[left]
+
nums[right];
if
(sum
==
0
){
list
=
new
ArrayList
<
Integer
>
();
list.add(nums[i]);
list.add(nums[left]);
list.add(nums[right]);
res.add(list);
left
++
;
while
(left
<
right
&&
nums[left]
==
nums[left
-1
]) left
++
;
right
--
;
while
(left
<
right
&&
nums[right]
==
nums[right
+1
]) right
--
;
}
else
if
(sum
<
0
)left
++
;
else
right
--
;
}
}
return
res;
}
}