最接近的三数之和

2019-11-29  本文已影响0人  二进制的二哈

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如:

给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

这道题跟“三数之和”那道题思路差不多,依旧是排序+双指针的思路,只需要做稍微的改动即可。
Java代码:

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int ans = target;
        Integer min = null;//最小差值(取绝对值)
        if(nums != null && nums.length > 2){
            //对数组排序
            Arrays.sort(nums);//-4,-1,1,2
            for(int i = 0;i<nums.length;i++){
                //避免重复计算
                if(i > 0 && nums[i] == nums[i-1])
                    continue;
                int left = i + 1;
                int right = nums.length - 1;
                while(left < right){
                    int sum = nums[i] + nums[left] + nums[right];
                    if(sum == target)
                        return target;
                    int tmp = sum - target;//差值
                    if(tmp > 0){
                        //说明现在的总和比target大,right就要往左移动
                        right--;
                    }else{
                        //说明现在的总和比target小,left就要往右移动
                        left++;
                    }
                    if(min == null || Math.abs(tmp) < min){
                        ans = sum;
                        min = Math.abs(tmp);
                    }
                }
            }
        }
        return ans;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读