第 16 题 最接近目标数的三数之和
对一个数组来说,找出其中的三个数,使得三数之和与target最接近,最先想到的是暴力法求解,对i = 0; j = i+ 1; k = j+1;进行三重遍历,记录对target距离的最小值,但是三重循环,时间复杂度0(n3)。
改进 : 对寻求目标数来说,三数之和要么比target 大 ,要么比target小,确定寻找方向很重要,可以对数组进行先排序,再找寻正确组合
首先,排序好的数组可以从两侧向中间逼近,最小数和最大数加和,如果和比target大,可以从排序右侧向中间调节,反之从排序向左侧调节,同时注意保证左侧索引值比右侧小,其中若找到和target相等的三数之和,则可以直接返回,因为此时距离为0.
class Solution {
public int threeSumClosest(int[] nums, int target) {
int min = Integer.MAX_VALUE;
int dis = 0;
Arrays.sort(nums);
int i = 0;
int j = 0;
int k = 0;
for( i = 0; i < nums.length-2; i++){
for(j = i+1, k = nums.length-1; j < k; ){
dis =(nums[i] + nums[j] + nums[k]);
if(Math.abs(dis-target) < Math.abs(min)){
min = dis - target;
}
if(j < k && dis < target){
j++;
}else if(j < k && dis > target){
k--;
} else return target;
}
}
return min+target;
}
}
原文地址:https://www.cnblogs.com/tiansiyuan-program/p/9728889.html