双指针,最接近的三数之和
1. 题目描述
难易度:中等
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
2. 思路分析
- 首先对数组排序,遍历数组,每次保存int a=nums[i]
- 使用start保存i的下一个位置下标,即start=i+1
- 初始化end=nums.length-1;
- 计算sum=nums[start]+nums[end]+a
- 计算sum和target的差值,计算target和tmp的差值,当前者小于后者时,则说明sum更接近target,则改变tmp的值为sum
- 当sum>target时让end–,当sum<target时让start++,循环遍历
3. 代码演示
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int start = 0;
int tmp = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length; i++) {
start = i + 1;
int end = nums.length - 1;
int a = nums[i];
while (start < end) {
int b = nums[start];
int c = nums[end];
int sum = a + b + c;
tmp=(Math.abs(target - sum) < Math.abs(target - tmp))?tmp=sum:tmp;
if (sum > target) {
end--;
} else if (sum < target) {
start++;
} else {
return sum;
}
}
}
return tmp;
}
}