[leetcode]16.最接近的三数之和

111 阅读1分钟
  • 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
  • 返回这三个数的和。
var threeSumClosest = function (nums, target) {
  nums.sort((a, b) => a - b);
  const length = nums.length;
  if(length<3) return 
  let result = nums[0] + nums[1] + nums[2];
  if (target <= result) {
    return result;
  }
  result = nums[length - 1] + nums[length - 2] + nums[length - 3];
  if (target >= result) {
    return result;
  }
  for (let i = 0; i < nums.length - 2; i++) {
    if (nums[i] === nums[i + 1]) i++ //优化:当我们枚举 a, b, c中任意元素并移动指针时,可以直接将其移动到下一个与这次枚举到的不相同的元素,减少枚举的次数。
    let s = i + 1;
    let t = nums.length - 1;
    while (s < t) {
      if (nums[s] === nums[s + 1]) s++ //优化
      if (nums[t] === nums[t- 1]) t--
      const tmp = nums[i] + nums[s] + nums[t];
      if (tmp < target) {
        s++;
      }
      if (tmp > target) {
        t--;
      }
      if (tmp === target) {
        result = target;
        break; //提前跳出循环
      }
      if (Math.abs(tmp - target) < Math.abs(result - target)) {
        result = tmp;
      }
    }
    if (result === target) {
      return target;
    }
  }
  return result;
};

此写法对于边界和需要提前退出的情况界定很清楚,也做了数组成员重复时的细小优化。