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 现在左指针指2,右指针指3 ,sum= 1 指针碰撞,进入下一次循环
  2. 第二次循环(i=1):
    -1先选中,在[1,2,3]中再找两个数,左指针从1开始,右指针从3开始。-1+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=Math.abs(target-sum)){
                        inAccurate = target -sum;
                    }
                    if(sum>target){
                        right--;
                    }
                    else if(sum

你可能感兴趣的:(算法)