数字和 - LC16 3sum Closest

2017-11-08  本文已影响0人  风烨

和15题的方法相近,就是通过绝对值找到最近的数字,时间附加度依然是O(n2)。

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int closest = nums[0] + nums[1] + nums[2];
        Arrays.sort(nums);
        for(int i = 0; i< nums.length-2; i++){
            if (i > 0 && nums[i] == nums[i - 1]) continue;// skip save value
            for(int j = i + 1, k = nums.length - 1; j < k;){ // j for nearst value, k for biggest value
                int sum = target - nums[i];
                if (nums[j] + nums[k] == sum) return target;
                if ( nums[j] + nums[k] > sum) {
                    while(j < k && nums[j] + nums[k] > sum ) --k;
                    closest = (Math.abs(sum - nums[j] - nums[k+1]) < Math.abs(target - closest)) ? 
                        nums[i]+nums[j]+nums[k+1] : closest;
                } else{
                    while(j < k && nums[j] + nums[k] < sum ) ++j;
                    closest = (Math.abs(sum - nums[j-1] - nums[k]) < Math.abs(target - closest)) ? 
                        nums[i]+nums[j-1]+nums[k] : closest;
                }
            }
        }
        return closest;  
    }
}
上一篇 下一篇

猜你喜欢

热点阅读