求取数组中三个数和最接近目标值
值得注意的是;1.题中提到的与target最接近的是三个整数的和
2.数组中n个整数,只取三个数
原本的思路:
-
先进行数组排序,利用二分法找出中间值与target进行比较
-
要求三个整数的和与target最接近,只需要找出数组中与target最接近的三个整数,在进行相加
代码如下`class Solution {
public int threeSumClosest(int[] nums, int target) {int closeNum = nums[0]+nums[1]+nums[2]; Arrays.sort(nums); int n = nums.length; for(int i = 0;i < n-2;i++){ int begin = 0; int sum = 0; int end = nums.length-1; int m = (begin+end)/2; if(nums[m]==target) { sum = nums[m]+nums[m-1]+nums[m+1]; System.out.println(sum); }else if(nums[m]<target&&target<nums[end]&&nums[m]>target&&target>nums[begin]) { sum = nums[target]+nums[target-1]+nums[target+1]; System.out.println(sum); }else if(target>nums[end]) { sum = nums[end-2]+nums[end-1]+nums[end]; System.out.println(sum); }else if(target<begin){ sum = nums[begin]+nums[begin+1]+nums[begin+2]; System.out.println(sum); } } return closeNum;
}
}
但是其中当target处于大于中间值小于最后一个元素,或是目标值大于第一个元素小于中建值时,无法判定周围的元素是最接近目标值的,根据网上其他解答者代码如下
class Solution {
public int threeSumClosest(int[] nums, int target) {
int closeNum = nums[0]+nums[1]+nums[2];
Arrays.sort(nums);
int n = nums.length;
for(int i = 0;i < n-2;i++){
//去重
if(i > 0 && nums[i] == nums[i-1]) continue;
int left = i+1,right = n-1;
//找出与target差值最小的和
while(left < right){
int nowNum = nums[i]+nums[left]+nums[right];
if(Math.abs(nowNum - target) < Math.abs(closeNum - target)){
closeNum = nowNum;
}
if(nowNum - target > 0){
right--;
}else if(nowNum - target < 0){
left++;
}else{
return target;
}
}
}
return closeNum;
}
}
针对上述提出的问题,如果有更好的解决办法请及时提出