- 算法
双指针 - 核心思想
我们需要实现a1+a2+a3无限逼近target,所以整个公式可以换为sum = a1+a2+a3-target。最终实现sum无限逼近于0。我选择固定a1-target,然后令一个指针从a2开始,另一个指针从尾开始,不断筛选最小值。 - 代码
class Solution {
public int threeSumClosest(int[] nums, int target) {
if(nums.length == 3) return nums[0]+nums[1]+nums[2];
int min = Integer.MAX_VALUE;
int i = 0;
Arrays.sort(nums);
while(i < nums.length){
int temp = nums[i] - target;
int l = i+1;
int r = nums.length - 1;
int sign = 0;
int sum = 0;
while(l < r){
sum = temp + nums[l] + nums[r];
if(sum > 0) {
r--;
if(min < 0){
min = sum > Math.abs(min) ? min : sum;
}
min = sum > min ? min : sum;
}
else if(sum < 0) {
l++;
if(min > 0){
min = Math.abs(sum) > min ? min : sum;
}
min = Math.abs(sum) > Math.abs(min) ? min : sum;
}
else return nums[i] + nums[l] + nums[r];
}
i++;
}
return min + target;
}
}