题意:
解题思路:
思路:
1. (三重枚举,无重复构造) O(n3)
2. 在 3Sum 算法的思路,排序后再增加一重循环即可。
PHP代码实现:
class Solution {
function fourSum($nums, $target) {
if (!$nums) return [];
sort($nums);
$ret = [];
for ($i = 0; $i < count($nums) - 3; $i++) {
if ($i > 0 && $nums[$i] == $nums[$i - 1]) continue;
for ($j = $i + 1; $j < count($nums) - 2; $j++) {
if ($j > $i + 1 && $nums[$j] == $nums[$j - 1]) continue;
$left = $j + 1;
$right = count($nums) - 1;
while ($left < $right) {
$sum = $nums[$i] + $nums[$j] + $nums[$left] + $nums[$right];
if ($sum == $target) {
array_push($ret, [$nums[$i], $nums[$j], $nums[$left], $nums[$right]]);
while ($left < $right && $nums[$left] == $nums[$left + 1]) $left++;
while ($left < $right && $nums[$right] == $nums[$right - 1]) $right--;
$left++; $right--;
} else if ($sum > $target) {
$right--;
} else $left++;
}
}
}
return $ret;
}
}
GO代码实现:
func fourSum(nums []int, target int) [][]int {
ans := make([][]int, 0)
if len(nums) < 4 {
return ans
}
sort.Ints(nums)
for i := 0; i <= len(nums) - 4; i++ {
if i > 0 && nums[i] == nums[i - 1] {
continue
}
for j := i + 1; j <= len(nums) - 3; j++ {
if j > i + 1 && nums[j] == nums[j - 1] {
continue
}
k := j + 1
l := len(nums) - 1
for k < l {
if nums[i] + nums[j] + nums[k] + nums[l] < target {
k++
} else if nums[i] + nums[j] + nums[k] + nums[l] > target {
l--
} else {
ans = append(ans, []int{nums[i], nums[j], nums[k], nums[l]})
for k < l && nums[k+1] == nums[k] {
k++
}
for k < l && nums[l-1] == nums[l] {
l--
}
k++
l--
}
}
}
}
return ans
}