一、题目还原
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
二、解题思路
①三数之和的思路和上一题一样
Solution 2 双指针
① EdgeCase:数组长度小于3或者等于三但是相加不等于0的,返回空
② 将数组进行排序
③ 定义左右两个下标,记为left = 0和right = nums.length - 1
④ 以第一个数num为基准,left和right分别从第二个数和最后一个数开始计算,如果num+nums[left]+nums[right] == 0则left ++; right --;注意,如果left的下一个与之前数字相同继续left++,right同理
⑤ 注意每次循环的基准数如果和上一次相同直接跳过进行下一次循环
② 定义一个diff表示三数之和与target的差,如果差越小,就取当前的和
三、代码展示
① main函数
public static void main(String[] args) {
int[] nums = {1,2,5,10,11};
int target = 12;
System.out.println(threeSumClosest(nums,target));
}
② threeSumClosest方法函数
public static int threeSumClosest(int[] nums, int target) {
if(nums.length < 3 ){
return 0;
}
Arrays.sort(nums);
int index = 0;
int diff = Integer.MAX_VALUE;
int result = 0;
for(int num : nums){
int left = index + 1;
int right = nums.length - 1;
if(index > 0 && num == nums[index-1]){
index ++;
continue;
}
while(left < right){
int sum = num + nums[left] + nums[right];
if(sum == target){
return sum;
}else if(sum < target){
left ++;
}else{
right --;
}
diff = Math.min(Math.abs(sum - target),diff);
result = Math.abs(sum - target) <= diff ? sum : result;
}
index ++;
}
return result;
}
控制台输出:
13
Process finished with exit code 0
四、自我总结
LeetCode第十六题,难度为中等,不过思路和上一题没有太大的区别,博主选择了双指针方法。
- 博主最近也将刷题的代码上传到github中,欢迎各位大佬们指点一二
Github仓库地址:https://github.com/w735937076/LeetCode
来源:CSDN
作者:郎才女喵
链接:https://blog.csdn.net/weixin_43724845/article/details/104914073