当前位置:   article > 正文

C++ | Leetcode C++题解之第16题最接近的三数之和

C++ | Leetcode C++题解之第16题最接近的三数之和

题目:

题解:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/687071
推荐阅读
相关标签
  

闽ICP备14008679号