Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
题目的意思是在数组中任意三个数的和最接近target的和
很明显,如果是朴素的做法,那么时间复杂度肯定是O(N^3)了,三个for;
我的做法是O(nlogn + n^2),首先使用排序算法对数组进行排序,使得数组有序
然后首先固定第一个数字,然后从数组的左右两端进行枚举,如果三个数之和
小于target,那么左端数字右移,否则右端数字左移,这样子可以再O(n^2)时间内完成
public class Solution {
public int threeSumClosest(int[] num, int target) {
Arrays.sort(num);
int len = num.length - 2;
int sum = 0;
int min = Integer.MAX_VALUE;
int ans = 0;
for(int i = 0; i < len; ++i){
for(int j = i + 1, k = num.length - 1; j < k; ){
sum = num[i] + num[j] + num[k];
if(Math.abs(sum - target) < min){
min = Math.abs(sum - target);
ans = sum;
}
if(sum - target < 0) ++j;
else --k;
}
}
return ans;
}
}