返回

前端者算法修炼:解锁16. 最接近的三数之和 [ 中等 ],算法实力不设限

前端

前言:算法修炼,前端赋能

作为一名前端开发者,仅仅掌握 HTML、CSS 和 JavaScript 已经远远不够了。随着技术发展,算法和数据结构知识逐渐成为前端工程师的必备技能。算法可以帮助我们解决复杂问题,优化代码性能,提升用户体验。

题目引入:16. 最接近的三数之和

LeetCode 16. 最接近的三数之和题目如下:

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使得它们的和与 target 最接近。

返回这三个数的和。如果没有满足条件的三个数,则返回 0。

例如:

输入:nums = [-1, 2, 1, -4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。

算法解析:三数之和的巧妙解法

解决这道题的关键在于理解题目的要求。题目要求我们从数组中选出三个整数,使得它们的和与目标值最接近。这里所说的“最接近”不是指绝对值最小的差值,而是指绝对值最小的和。

因此,我们可以采用以下步骤来解决这个问题:

  1. 对数组 nums 进行排序。
  2. 使用三个指针 i、j 和 k 分别指向数组 nums 的三个元素。
  3. 计算指针 i、j 和 k 所指向的三个元素的和 sum。
  4. 如果 sum 等于 target,则返回 sum。
  5. 如果 sum 大于 target,则指针 j 右移一位。
  6. 如果 sum 小于 target,则指针 i 右移一位。
  7. 重复步骤 3 到步骤 6,直到指针 i 和 j 遍历完数组 nums。
  8. 如果没有找到三个元素的和等于 target,则返回 0。

代码实现:JavaScript 解题思路

/**
 * 求三个数的和最接近目标值的函数
 * @param {number[]} nums 输入的数组
 * @param {number} target 目标值
 * @return {number} 最接近目标值的三个数的和
 */
const threeSumClosest = (nums, target) => {
  // 对数组进行排序
  nums.sort((a, b) => a - b);

  // 初始化三个指针
  let i = 0;
  let j = 1;
  let k = nums.length - 1;

  // 初始化最接近目标值的和
  let closestSum = Infinity;

  // 遍历数组
  while (i < k) {
    // 计算三个指针所指向的三个元素的和
    const sum = nums[i] + nums[j] + nums[k];

    // 如果 sum 等于 target,则返回 sum
    if (sum === target) {
      return sum;
    }

    // 如果 sum 大于 target,则指针 j 右移一位
    if (sum > target) {
      k--;
    }

    // 如果 sum 小于 target,则指针 i 右移一位
    if (sum < target) {
      i++;
    }

    // 更新最接近目标值的和
    if (Math.abs(sum - target) < Math.abs(closestSum - target)) {
      closestSum = sum;
    }
  }

  // 返回最接近目标值的和
  return closestSum;
};

复杂度分析:时间与空间

  • 时间复杂度:O(n^2)。由于需要对数组进行排序,因此时间复杂度为 O(n log n)。
  • 空间复杂度:O(1)。算法不需要额外的空间,因此空间复杂度为 O(1)。

总结:算法进阶,前端之路更宽广

通过本文的学习,你已经掌握了如何解决 LeetCode 16. 最接近的三数之和题目。这道题不仅考验了你的算法思维,也考验了你的 JavaScript 编程能力。

作为一名前端开发者,学习算法不仅可以帮助你解决复杂问题,优化代码性能,提升用户体验,还能开拓你的思维,让你成为一名更全面的工程师。