给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
/** * 双指针法 * @param nums * @param target * @return */ public static int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int result = nums[0] + nums[1] + nums[2]; for(int i=0;i<nums.length-2;i++){ int left = i+1; int right = nums.length - 1; while(left != right){ int min = nums[i] + nums[left] + nums[left + 1]; if(target < min){ if(Math.abs(result - target) >= Math.abs(min - target)) { result = min; } break; } int max = nums[i] + nums[right] + nums[right - 1]; if(target > max){ if(Math.abs(result - target) >= Math.abs(max - target)) { result = max; } break; } int sum = nums[i] + nums[left] + nums[right]; // 判断三数之和是否等于target if(sum == target) { return sum; } if(Math.abs(sum - target) < Math.abs(result - target)) { result = sum; } if(sum > target){ right--; while(left != right && nums[right] == nums[right+1]) { right--; } } else { left++; while(left != right && nums[left] == nums[left-1]) { left++; } } } while(i<nums.length-2 && nums[i] == nums[i+1]) { i++; } } return result; }