给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
解题:
排序+双指针:
in向右移动,移动到数组长度-2的位置(留给i和j)
i,j指针相向移动,每次计算对应三个数的和sum,若结果res-目标数字target的差值大于sum-target
则让res = sum;
由于排序后,数组向右增大,所以如果sum-target<0,则i向右移动,sum-target>0则向左。
代码如下:
int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int res;
int minValue = Integer.MAX_VALUE;
int ans = 0;
for (int in = 0; in < nums.length - 2; in++) {
int i = in + 1;int j = nums.length - 1;
while (i < j) {
int s = nums[i] + nums[in] + nums[j];
res = target - s;
int a = Math.abs(res);
if (minValue > a) {
minValue = a;
ans = s;
}
if (minValue == 0) {
return ans;
}
else if(res >= 0)
i++;
else j--;
}
}
return ans;
}