题目描述

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

  1. 例如,给定数组 nums = [-121,-4], target = 1.
  2. target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

题解

通过双指针减少一层循环。比较当前三数和与 target,控制 low 和 high 往差值更小的方向移动。

  1. public int ThreeSumClosest(int[] nums, int target)
  2. {
  3. nums = nums.OrderBy(n => n).ToArray();
  4. var sum = nums[0] + nums[1] + nums[2];
  5. for (var i = 0; i < nums.Length - 2; i++)
  6. {
  7. int low = i + 1, high = nums.Length - 1;
  8. while (low < high)
  9. {
  10. var newSum = nums[i] + nums[low] + nums[high];
  11. var diffNew = target > newSum ? target - newSum : newSum - target;
  12. var diffOld = target > sum ? target - sum : sum - target;
  13. if (diffNew < diffOld)
  14. {
  15. if (newSum == target) return newSum;
  16. sum = newSum;
  17. while (low < high && nums[low] == nums[low + 1]) low++;
  18. while (low < high && nums[high] == nums[high - 1]) high--;
  19. }
  20. if (newSum < target) low++;
  21. else high--;
  22. }
  23. }
  24. return sum;
  25. }