方法一:
这一道题目自然也是有Brute Froce的解法,一开始思考的方法是通过三重循环和一个HashMap,分别记下来每种组合所对应的sum的大小,然后再从中找到与target最为接近的数返回。这种方法的时间复杂度很高,为O(n^3),再加上HashMap和比较大小所用的时间,在leetcode oj上面几乎肯定要超时,所以详细的代码就不写了
方法二:
思考前面做过的3Sum题目,在这一题目中,我们通过一个外层循环遍历数组中的每个数字,然后在每一个外层循环中设置两个分别指向数组剩余部分的头和尾的指针,然后通过移动两个指针来找到target。这一道题目与3Sum非常相似,我们可以考虑同样的思路,但是注意到这一题目中也有变化,首先,我们并不是去寻找target,而是去寻找与target相差最小的数字,这是一个常见的问题,可以通过设置一个初始值为Integer,MAX_VALUE的标志量,每一个差值与其比较来得到解决,另一个不同则是这里需要的只是一个数字,并不用找出全部的组合,所以在答案中并不需要对数组中元素的重复性进行检验
public class Solution {
public int threeSumClosest(int[] nums, int target) {
//sort array
Arrays.sort(nums);
int result = 0;
int pfront;
int pback;
//max value
int diff = Integer.MAX_VALUE;
for(int i = 0; i < nums.length - 2; i++){
//set pointers
pfront = i + 1;
pback = nums.length - 1;
while(pfront < pback){
int sum = nums[i] + nums[pfront] + nums[pback];
if(sum == target){
return target;
}else if(Math.abs(target - sum) < diff){
//update closest value and diff
diff = Math.abs(target - sum);
result = sum;
}
//move pointers
if(sum < target){
pfront++;
}else{
pback--;
}
}
}
return result;
}
}
知识点:
1. Integer.MAX_VALUE, Integer.MIN_VALUE;
2. 找与一个数字相差最近的数字是一类常见的子问题,可以设置一个标志量,将其初始值设置为最大或者最小,然后得到的每一个结果都与其进行比较,根据情况更新