給定一個包括 n 個整數(shù)的數(shù)組 nums 和 一個目標值 target。找出 nums 中的三個整數(shù),使得它們的和與 target 最接近。返回這三個數(shù)的和价脾。假定每組輸入只存在唯一答案。
示例:
輸入: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
public int threeSumClosest(int[] nums, int target) {
int ret=0;
//依舊先排序彼棍,便于計算目標范圍
Arrays.sort(nums);
//第一重循環(huán)灭忠,確定第一位數(shù)
int temp= Integer.MAX_VALUE;//存儲差值:因為提示了取值范圍膳算,所以三個數(shù)和target的差值已經(jīng)不可能超過Integer.MAX_VALUE
for (int i=0;i< nums.length-2;i++){
int left=i+1;
int right=nums.length-1;
//雙指針
while (left<right){
//因為之前有序的,所以當i+l+r>target弛作,否則r+1比r更大涕蜂,會導致>target更多
//當然i+l+r<target時候則需要右移l,否則會導致<target更小
//如果我們能找到剛好相等的結(jié)果直接結(jié)束循環(huán),否則我們應該不停比較差值映琳,留下最小值
int sum=nums[i]+nums[left]+nums[right];
if (sum>target){
right--;
}else if (sum<target){
left++;
}else {
return sum;
}
if (Math.abs(sum-target)<temp){
temp=Math.abs(sum-target);
ret=sum;
}
}
}
return ret;
}