leetCode题目入下:
给你一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人解题:
恬不知耻的用了两数之和的写法,数组小还好说,但是数组一大就崩了T_T。贴上崩了的代码以示警:
class Solution {
/**
* @param Integer[] $nums
* @return Integer[][]
*/
function threeSum($nums) {
$dd = [];
sort($nums);
for($i = 0; $i < count($nums); $i++) {
for($j = $i + 1; $j < count($nums); $j++) {
for($k = $j + 1; $k < count($nums); $k++) {
if(($nums[$i] + $nums[$j] + $nums[$k] == 0) && $i!=$j && $i!=$k && $j != $k) {
if (!in_array([$nums[$i],$nums[$j],$nums[$k]], $dd)) {
$dd[] = [$nums[$i],$nums[$j],$nums[$k]];
}
}
}
}
}
return $dd;
}
}
再贴上大神写的:
class Solution {
/**
* @param Integer[] $nums
* @return Integer[][]
*/
function threeSum($nums) {
$res = [];
sort($nums);
$len = count($nums);
for ($i = 0; $i < $len; $i++) {
if ($nums[$i] > 0) continue;
if ($i > 0 && $nums[$i -1] == $nums[$i]) continue;
$front = $i + 1;
$rear = $len - 1;
while ($front < $rear) {
$sum = $nums[$i] + $nums[$front] + $nums[$rear];
if ($sum == 0) {
$res[] = [$nums[$i], $nums[$front], $nums[$rear]];
while ($front < $rear && $nums[$front] == $nums[$front + 1]) $front++;
while ($front < $rear && $nums[$rear - 1] == $nums[$rear]) $rear--;
$front++;
$rear--;
} elseif ($sum > 0) {
$rear--;
} else {
$front++;
}
}
}
return $res;
}
}
作者:salmonl
链接:https://leetcode-cn.com/problems/3sum/solution/shuang-zhi-zhen-php-by-salmonl-8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。