思路
-
这道题与三数之和类似(三数之和解题思路)
-
对nums进行排序,定义返回结果res
-
循环res
-
如果当前下标不等于0并且当前元素等于上一个元素,为避免重复,跳过此次循环
-
定义left和right两个指针,left为当前下标+1;right为最后一个下标
-
循环;结束条件:left不小于right
- 求出当前元素和left和right的和sum
- 如果sum等于target;返回sum
- 如果sum不等于target;获取当前sum与target的差 (由于获取的是最接近的和,差要进行绝对值);
- 如果当前差小于res;将sum赋值给res
- 如果sum大于target;移动right,再移动的过程中,需要判断right的上一个元素是否与当前元素相等;如果相等要继续移动,直至不等为止
- 如果sum小于target;移动left,再移动的过程中,需要判断left的下一个元素是否与当前元素相等;如果相等要继续移动,直至不等为止
-
-
将res返回即可
java
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int length = nums.length;
int res = Integer.MAX_VALUE;
for (int i = 0; i < length; i++) {
int num = nums[i];
if (i > 0 && num == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = length - 1;
while (left < right) {
int sum = num + nums[left] + nums[right];
if (sum == target) {
return sum;
}
if (Math.abs(sum - target) < Math.abs(res - target)) {
res = sum;
}
if (sum > target) {
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
right--;
continue;
}
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
left++;
}
}
return res;
}
go
import (
"math"
"sort"
)
func threeSumClosest(nums []int, target int) int {
res := math.MaxInt32
length := len(nums)
sort.Ints(nums)
for i, v := range nums {
if i > 0 && v == nums[i-1] {
continue
}
left, right := i+1, length-1
for left < right {
sum := v + nums[left] + nums[right]
if sum == target {
return sum
}
if math.Abs(float64((sum - target))) < math.Abs(float64((res - target))) {
res = sum
}
if sum > target {
for left < right && nums[right] == nums[right-1] {
right--
}
right--
continue
}
for left < right && nums[left] == nums[left+1] {
left++
}
left++
}
}
return res
}