给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
/**
* @param Integer[] $nums
* @return Integer[][]
* 1.将数组排序 2.定义三个指针,i,j,k。遍历i,那么这个问题就可以转化为在i之后的数组中寻找nums[j]+nums[k]=-nums[i]这个问题,也就将三数之和问题转变为二数之和---(可以使用双指针)
*/
function threeSum($nums) {
sort($nums);
$len = count($nums);
$res = [];
for ($i=0;$i<=$len-3;$i++){
$j= $i+1;
$k = $len-1;
while ($j < $k){
if($nums[$i] == ($nums[$j]+$nums[$k])*-1){
if(!in_array([$nums[$i],$nums[$j],$nums[$k]],$res)){
$res[] = [$nums[$i],$nums[$j],$nums[$k]];
}
$j++;
$k--;
while ($j<$k && $nums[$j]===$nums[$j-1]){
$j++;
}
while ($j<$k && $nums[$k]===$nums[$k+1]){
$k--;
}
}else{
if($nums[$i]+$nums[$j]+$nums[$k]<0){
$j++;
while ($j<$k && $nums[$j]===$nums[$j-1]){
$j++;
}
}else{
$k--;
while ($j<$k && $nums[$k]===$nums[$k+1]){
$k--;
}
}
}
}
}
return $res;
}
print_r(threeSum([-2,0,1,1,2]));