题目

最接近的三数之和 - 图1

解题思路

一开始先对数组排序。

i是用于循环的指针,j和k分别是首尾指针。

三数之和和目标数的差<上一个差值,那么就赋值

和如果大于目标数,那么尾指针前移

和如果小于目标数,那么头指针后移

代码

  1. class Solution {
  2. public int threeSumClosest(int[] nums, int target) {
  3. Arrays.sort(nums);
  4. int n = nums.length;
  5. int best = 10000000;
  6. // 枚举 a
  7. for (int i = 0; i < n; ++i) {
  8. // 保证和上一次枚举的元素不相等
  9. if (i > 0 && nums[i] == nums[i - 1]) {
  10. continue;
  11. }
  12. // 使用双指针枚举 b 和 c
  13. int j = i + 1, k = n - 1;
  14. while (j < k) {
  15. int sum = nums[i] + nums[j] + nums[k];
  16. // 如果和为 target 直接返回答案
  17. if (sum == target) {
  18. return target;
  19. }
  20. // 根据差值的绝对值来更新答案
  21. if (Math.abs(sum - target) < Math.abs(best - target)) {
  22. best = sum;
  23. }
  24. if (sum > target) {
  25. // 如果和大于 target,移动 c 对应的指针
  26. int k0 = k - 1;
  27. // 移动到下一个不相等的元素
  28. while (j < k0 && nums[k0] == nums[k]) {
  29. --k0;
  30. }
  31. k = k0;
  32. } else {
  33. // 如果和小于 target,移动 b 对应的指针
  34. int j0 = j + 1;
  35. // 移动到下一个不相等的元素
  36. while (j0 < k && nums[j0] == nums[j]) {
  37. ++j0;
  38. }
  39. j = j0;
  40. }
  41. }
  42. }
  43. return best;
  44. }
  45. }