题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
方法:
双指针法:
- 将数组进行排序,以便双指针的移动,此时排序时间复杂度为O(nlogn)
- 通过第一层循环固定k,然后再将指针i=k+1;j=nums.length-1初始化
- 如果在遍历的过程中,发现Math.abs(target-temp)<Math.abs(target-closeInteger),将closeInteger = temp;
- 如果temp>target,j前移
- 如果temp>target,i后移
- 如果temp==target,证明已经找到直接返回temp;
- 时间复杂度为:O(n^2)+O(nlogn)=O(n^2)
详细代码:
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int closeInteger = nums[0]+nums[1]+nums[2];
for(int k = 0 ;k<nums.length;k++){
int i =k+1,j=nums.length-1;
while(i<j){
int temp = nums[i]+nums[j]+nums[k];
if(Math.abs(target-temp)<Math.abs(target-closeInteger)){
closeInteger = temp;
}
if(temp>target) j--;
else if(temp<target) i++;
else return temp;
}
}
return closeInteger;
}
}