用 PHP 来刷leetCode 之 最接近的三数之和

15 篇文章 0 订阅

给定一个包括 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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值