题目
给定一个包括 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
解法
思路: 排序 + 双指针。具体细节看代码中注释。
class Solution {
public int threeSumClosest(int[] nums, int target) {
if(nums == null || nums.length < 3){
return 0;
}
// 排序
Arrays.sort(nums);
// 初始化最接近目标值的和
int closestSum = nums[0] + nums[1] + nums[2];
for(int i = 0 ; i < nums.length - 2 ; i++){
int left = i + 1 , right = nums.length - 1;
while(left < right){
int sum = nums[left] + nums[right] + nums[i];
// 判断当前和与最接近目标值的和哪个更加接近target
if(Math.abs(sum - target) < Math.abs(closestSum - target)){
closestSum = sum;
}
// 如果和小于target,则左指针右移
if(sum < target){
left++;
// 判断右移后的值是否和上一个值相等,如果相等,跳过
while(left < right && nums[left] == nums[left-1]){
left++;
}
// 如果和大于target,则右指针左移
} else if(sum > target){
right--;
// 判断左移后的值是否和上一个值相等,如果相等,跳过
while(left < right && nums[right] == nums[right+1]){
right--;
}
} else {
// 如果与目标值相等,直接返回就行了。
return target;
}
}
}
return closestSum;
}
}
总结
本篇文章讲解了算法题目的思路和解法,代码和笔记由于纯手打,难免会有纰漏,如果发现错误的地方,请第一时间告诉我,这将是我进步的一个很重要的环节。以后会定期更新算法题目以及各种开发知识点,如果您觉得写得不错,不妨点个关注,谢谢。