算法题之最接近的三数之和问题
题目描述
题目分析
图解
以上面给的示例为例:
代码实现
public int threeSumClosest(int[] nums, int target) {
//定义一个存储每一次三个数组合的和
int res = 0;
//若nums为null或者长度小于3,直接返回0
if (nums == null || nums.length < 3) {
return res;
}
//若nums长度刚好只有3个:则只有一种情况,直接返回这三个数的和
if (nums.length == 3) {
return nums[0] + nums[1] + nums[2];
}
//对nums数组进行从小到大的排序
Arrays.sort(nums);
//先定义一个最接近的起始比较值
int cmp = nums[0] + nums[1] + nums[nums.length - 1];
//对数组进行遍历处理处理
for (int i = 0; i < nums.length; i++) {
//若遍历到最后少于三个元素,则直接break
if (nums.length - i < 3) {
break;
}
//去重操作:nums[i] == nums[i - 1]:则这种选择的情况是nums[i]选择情况的子集
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
//定义左指针和右指针
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
res = nums[i] + nums[left] + nums[right];
if (res == target) {
return res;
}else if (res < target) {
//比较res和cmp谁更接近target,从而选择更新cmp的值,然后将left++
if (Math.abs(res - target) < Math.abs(cmp - target)) {
cmp = res;
}
left++;
}else if (res > target) {
//比较res和cmp谁更接近target,从而选择更新cmp的值,然后将right--
if (Math.abs(res - target) < Math.abs(cmp - target)) {
cmp = res;
}
right--;
}
}
}
return cmp;
}