题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
分析
方法一:暴力遍历所有可能出现的情况,比较所有情况中结果最小的那个。
方法二:首先排序,将数组中的元素按照从小到大的顺序进行排序,在数组nums中,进行遍历,每遍历一个值利用其下标i,形成一个固定值 nums[i]。建立一个双指针,头指针指向nums[i+1],尾指针指向结尾处。根据 sum = nums[i] + nums[start] + nums[end] 的结果,判断 sum 与目标 target 的距离,如果更近则更新结果 ans,同时需要判断sum与target的大小关系,因为数组是有序的,如果sum > target则end - -,如果sum<target则start++,如果sum == target说明差值为0则直接返回结果。
代码实现
方式一:
public class ThreeSumClosest {
public int threeSumClosest(int[] nums, int target) {
int len = nums.length;
int min = 10000;
int diff =0;
int ans = 0;
for(int i=0; i<len-2; i++) {
for(int j=i+1; j<len-1; j++) {
for(int m = j+1; m <len; m++) {
diff = Math.abs(nums[i]+nums[j]+nums[m]-target);
if(min > diff) {
min = diff;
ans = nums[i]+nums[j]+nums[m];
}
}
}
}
return ans;
}
public static void main(String[] args) {
int target = 1;
int[] nums = {-1,2,1,-4};
ThreeSumClosest three = new ThreeSumClosest();
System.out.println(three.threeSumClosest(nums, target));
}
}
方法二:
import java.util.Arrays;
public class ThreeSumClosest2 {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums); //对数组进行排序
int cha = 100000;
int sum = 0;
int ans = 0;
for(int i = 0; i < nums.length; i++) {
int m = i+1;
int n = nums.length-1;
while(m < n) {
sum = nums[i]+nums[m]+nums[n];
int abs = Math.abs(sum - target);
if(cha > abs) {
cha = abs;
ans = sum;
}
if(sum > target)
n--;
if(sum < target)
m++;
if(sum == target)
return sum;
}
}
return ans;
}
public static void main(String[] args) {
int target = -100;
int[] nums = {1,1,1,0};
ThreeSumClosest2 three = new ThreeSumClosest2();
System.out.println(three.threeSumClosest(nums, target));
}
}