思路
三个数的和那道题的延伸,思路就是确定两个数,用双指针遍历剩下的
判重的时候,我用了个map
代码
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[][]
*/
function fourSum($nums, $target) {
sort($nums);
$size = count($nums);
$result = array();
$exist = array();
for ($i = 0; $i < $size; $i++) {
for ($j = $i + 1; $j < $size; $j++) {
$start = $j + 1;
$end = $size - 1;
// $exist = array(); // 之前判重的数组放在这,会被清空,导致报错
while ($start < $end) {
$sum = $nums[$i] + $nums[$j] + $nums[$start] + $nums[$end];
if ($sum < $target) {
$start++;
} else if ($sum > $target) {
$end--;
} else {
$ret = array();
$key = strval($nums[$i]) . '+' . strval($nums[$j]) . '+' . strval($nums[$start]) . '+' . strval($nums[$end]);
if (!$exist[$key]){
array_push($ret, $nums[$i], $nums[$j], $nums[$start], $nums[$end]);
array_push($result, $ret);
}
$exist[$key] = 1;
$start++;
$end--;
}
}
}
}
return $result;
}
}