leetcode-16:最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如,给定数组 nums = [-1,2,1,-4], 和 target =1
与 target 最接近的三个数的和为 2.
(-1 + 2 + 1 = 2).

思想:

先进行排序Array.sort() [-4,-1,1,2] for nums.length <- i 表示如果nums[i]在三个数之中 若当前的sum-target的绝对值(当前误差)比最小误差小,则更新最小误差为当前误差, 循环内用一个双指针,left 为i+1 right为length-1,如果nums[i]+nums[left]+nums[right]< target 左指针向右增大当前值,否则右指针向左减小当前值。 误差inc初始化为MAX_INT [-4,-1,1,2,3] target=4

  1. 第一次循环(i=0):
    -4先选中 在后面找[-1,1,2,3]两个数,以第一个-1和最后一个3 为开始,-1+3±4 = 2 小于4,左指针右移。误差 = 1-4=6 绝对值6小于当前误差,更新误差。
    现在左指针指1 ,右指针指3 ,-4+1+3 = 0<target;左指针右移,误差更新为6,
    现在左指针指2,右指针指3 ,sum= 1<target ;左指针右移,更新误差
    指针碰撞,进入下一次循环
  2. 第二次循环(i=1):
    -1先选中,在[1,2,3]中再找两个数,左指针从1开始,右指针从3开始。-1+3+1 = 3<target,左指针右移。误差=4-3 =1小于当前最小值。更新误差为3
    现在左指针指2 右指针指3,2+3±1 = 4 = target。
    找到了误差最小的,直接返回target。

源代码如下:

执行用时 : 16 ms, 在3Sum Closest的Java提交中击败了78.29% 的用户
内存消耗 : 37.6 MB, 在3Sum Closest的Java提交中击败了72.72% 的用户
    class Solution {
        public int threeSumClosest(int[] nums, int target) {
            Arrays.sort(nums);
            int sum;
            int inAccurate = target - (nums[0]+nums[1]+nums[2]);
            for(int i=0;i<nums.length-2;i++){
                int left = i+1;
                int right = nums.length-1;
                while(left<right){
                    sum = nums[i]+nums[left]+nums[right];
                    if(Math.abs(inAccurate)>=Math.abs(target-sum)){
                        inAccurate = target -sum;
                    }
                    if(sum>target){
                        right--;
                    }
                    else if(sum<target){
                        left++;
                    }
                    else{
                        return target;
                    }
                }
            }
            return target-inAccurate;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值