算法-三数之和

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!

算法-三数之和_第1张图片

function threeSum(nums) {
    // 用于存储最终结果的数组
    const result = [];
    // 首先对数组进行排序,方便后续操作
    nums.sort((a, b) => a - b);
    const n = nums.length;

    // 遍历数组,将当前元素作为三元组的第一个元素
    for (let i = 0; i < n - 2; i++) {
        // 如果当前元素和前一个元素相同,跳过以避免结果重复
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue;
        }

        // 初始化左右指针
        let left = i + 1;
        let right = n - 1;
        const target = -nums[i];

        // 使用双指针法在剩余元素中寻找满足条件的另外两个元素
        while (left < right) {
            const sum = nums[left] + nums[right];

            if (sum === target) {
                // 找到满足条件的三元组,添加到结果数组中
                result.push([nums[i], nums[left], nums[right]]);

                // 跳过重复元素,避免结果中出现重复的三元组
                while (left < right && nums[left] === nums[left + 1]) {
                    left++;
                }
                while (left < right && nums[right] === nums[right - 1]) {
                    right--;
                }

                // 移动指针继续寻找其他可能的组合
                left++;
                right--;
            } else if (sum < target) {
                // 当前和小于目标值,左指针右移增大和
                left++;
            } else {
                // 当前和大于目标值,右指针左移减小和
                right--;
            }
        }
    }

    return result;
}

// 测试示例
const nums = [-1, 0, 1, 2, -1, -4];
console.log(threeSum(nums)); 

代码解释

整体思路
本题要求找出数组中所有和为 0 且不重复的三元组。为了方便处理,首先对数组进行排序。然后遍历数组,将当前元素作为三元组的第一个元素,接着使用双指针法在剩余元素中寻找满足和为 -nums[i] 的另外两个元素。在寻找过程中,需要跳过重复元素以避免结果中出现重复的三元组。

代码步骤分析

排序数组:

  • 使用 sort 方法对数组 nums 进行排序,排序规则为升序。

遍历数组:

  • 使用 for 循环遍历数组,将当前元素 nums[i] 作为三元组的第一个元素。
  • 如果当前元素和前一个元素相同,跳过当前元素,避免结果重复。

双指针法寻找另外两个元素:

  • 初始化左指针 left 为 i + 1,右指针 right 为数组的最后一个元素的索引 n - 1。
  • 计算目标值 target 为 -nums[i],即需要在剩余元素中找到两个元素的和等于 target。
  • 使用 while 循环,只要 left 小于 right 就继续循环:
  • 计算当前左右指针所指元素的和 sum。
  • 如果 sum 等于 target,说明找到了满足条件的三元组,将其添加到结果数组 result 中。
  • 跳过左右指针所指元素的重复元素,避免结果中出现重复的三元组。
  • 移动左右指针继续寻找其他可能的组合。
  • 如果 sum 小于 target,说明当前和太小,左指针右移增大和。
  • 如果 sum 大于 target,说明当前和太大,右指针左移减小和。

返回结果:

  • 遍历结束后,返回结果数组 result。

你可能感兴趣的:(150道经典算法面试习题,算法,javascript,数据结构)