LeetCode 3Sum Closest

题意很明确,就取数列中每一个点,然后取数列两端边缘与选定点求和,如果比target大就舍弃最右边点,因为有它在和选定点加起来不可能更接近target了。同理比target小就舍弃最左边的店

import static java.lang.StrictMath.abs;
import java.util.Arrays;
class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int len = nums.length,sum = 0;
        if(len <= 3){
            for(int i = 0;i < len;i++) sum += nums[i];
            return sum;
        }
        sum = nums[0] + nums[1] + nums[2];
        Arrays.sort(nums);
        for(int i = 0;i < len;i++){
            if(i >= 1 && (nums[i] == nums[i-1])) continue;
            int gap2 = abs(target - sum);
            int l = i + 1,r = len - 1;
            while(l < r){
                if(gap2 > abs(target - nums[i] - nums[l] - nums[r])){
                    sum = nums[i] + nums[l] + nums[r];
                    gap2 = abs(target - sum);
                    if(sum == target) return sum;
                }
                if(target > nums[i] + nums[l] + nums[r]) l++;
                else r--;
            }
        }
        return sum;
    }
}
原文地址:https://www.cnblogs.com/shimu/p/10446393.html