思路:双指针
- 利用 Arrays.sort(nums) 对数组进行排序。
- 初始化一个用于保存结果的值
result = nusm[0] + nums[1] + nums[2]
。 - 利用下标 i 对数组进行遍历,此时就是在固定第一个元素,注意,下标 i 的边界为 i < nums.length-2,否则设置指针的时候会出现数组越界。
- 每次遍历的过程中设置两个指针,分别是
left = i + 1
、right = nums.length - 1
。 - 检查
sum = nums[i] + nums[left] + nums[right]
与target
的距离,如果该距离比之前保存的result
与target
的距离更小,就更新result
。 - 移动双指针。
- 如果
sum
的值比target
大,那么我们让right--
,因为数组是有序的,right--
会使得下一次的sum
更小,也就更接近target
的值 - 同理,如果
sum
的值target
小,那么我们让left++
。· left++
和right--
的界限自然是left != right
,如果left == right
,说明已经将所有的元素都遍历过一遍了。- 重复上面的操作,直到循环结束,返回
result
。
/**
* 16. 最接近的三数之和(双指针)
* @param nums
* @param target
* @return
*/
int threeSumClosest(vector<int> &nums, int target) {
sort(nums.begin(), nums.end());
int result = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.size() - 2; i++) {
int left = i + 1;
int right = nums.size() - 1;
while (left != right) {
int sum = nums[i] + nums[left] + nums[right];
if (abs(sum - target) < abs(result - target)) {
result = sum;
}
if (sum > target)right--;
else left++;
}
}
return result;
}