16. 3Sum Closest

一、题目

  1、审题

    

 

  2、分析:

    给出一个数字数组,求其中三个元素的和让其最接近 target。

 

二、解答

  1、分析:

    a、将数组 nums 排序,遍历数组中元素;

    b、遍历下标为 i 的元素时,取 low 指针指向下标为 i + 1 的元素, high 指向数组最后一个元素下标;

    c、循环判断 当 low < high 时,令 sum = nums[i] + nums[low] + nums[high] ,比较 sum 是否最接近 target;    

      若  sum = target , 则返回 target;  

      若 sum > target, 则 high--;

      否则, low--;

class Solution {
    public int threeSumClosest(int[] nums, int target) {

        if(nums.length == 0)
            return 0;

        Arrays.sort(nums);
        int result = nums[0] + nums[1] + nums[2];
        for (int i = 0; i < nums.length - 2; i++) {

            // if(nums[i] > target)
            //     break;

            int low = i + 1, high = nums.length - 1;
            if((i > 0 && nums[i] != nums[i-1]) || i == 0) {

                while(low < high) {
                    int sum = nums[i] + nums[low] + nums[high];
                    if (sum - target == 0)
                        return target;

                    if(Math.abs(sum - target) < Math.abs(result - target))
                        result = sum;

                    if (sum - target < 0)
                        low++;
                    else
                        high--;
                }
            }

        }

        return result;
    }
}

 

posted @ 2018-08-02 20:49  skillking2  阅读(99)  评论(0编辑  收藏  举报