给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2)
先排序, 然后遍历, 然后内部使用双指针, 时间复杂度应该是O(n²), 代码如下:
/**
* @param $nums
* @param $target
* @return int
*/
function threeSumClosest($nums, $target) {
$count = count($nums);
if($count < 3){
return 0;
}
if($count == 3){
return array_sum($nums);
}
sort($nums);
$res = $nums[0]+$nums[1]+$nums[$count-1];
for ($i = 0;$i <= $count-3;$i++){
$j = $i+1;
$k = $count-1;
while ($k > $j){
$tmpSum = $nums[$j]+$nums[$k]+$nums[$i];
//如果相等 就直接返回target 跳出循环
if($tmpSum === $target){
return $target;
}
if(abs($target-$nums[$i]-$nums[$j]-$nums[$k])<abs($target-$res)){
$res = $nums[$i]+$nums[$j]+$nums[$k];
}
if($tmpSum < $target){
$j++;
}else{
$k--;
}
}
}
return $res;
}
echo threeSumClosest([0,1,1,1],-100);