数字数组中找到两个数,它们的和等于给定的目标值

在一个给定的数字数组中找到两个数,它们的和等于给定的目标值。可以通过多种方法来解决这个问题,以下是两种常见且高效的解决方案。

方法 1:使用哈希表 (Set 或 Map)

通过哈希表来存储已经遍历过的数字,利用哈希表的快速查找特性来实现。在遍历数组的同时,检查当前数字与目标值的差值是否已经存在于哈希表中。如果存在,则找到了符合条件的两个数。

        function twoSum(nums, target) {
            let map = new Map();
            for (let i = 0; i < nums.length; i++) {
                //计算需要的值
                let complement = target - nums[i];
                //已遍历元素中是否存在这样的值
                if (map.has(complement)) {
                    return [map.get(complement), i];
                }
                //当前元素已遍历过,记录到map中
                map.set(nums[i], i);
            }

            // 如果没有找到符合条件的两个数,返回空数组
            return [];
        }
        // 测试
        console.log(twoSum([2, 7, 11, 15], 9));  // 输出 [0, 1],因为 2 + 7 = 9
        console.log(twoSum([3, 2, 4], 6));       // 输出 [1, 2],因为 2 + 4 = 6
        console.log(twoSum([3, 3], 6));          // 输出 [0, 1],因为 3 + 3 = 6

 

方法 2:使用双指针法(要求数组已排序)

 两个指针分别从数组的两端向中间靠拢,计算当前指针所指数字的和与目标值的差,并根据差值来调整指针的位置。

function twoSum(nums, target) {
    nums.sort((a, b) => a - b);  // 排序数组
    let left = 0;
    let right = nums.length - 1;

    while (left < right) {
        let sum = nums[left] + nums[right];

        if (sum === target) {
            return [left, right];  // 找到满足条件的两个数,返回它们的索引
        } else if (sum < target) {
            left++;  // 如果和小于目标值,移动左指针向右
        } else {
            right--; // 如果和大于目标值,移动右指针向左
        }
    }

    return [];  // 如果没有找到符合条件的两个数,返回空数组
}

// 测试
console.log(twoSum([2, 7, 11, 15], 9));  // 输出 [0, 1]
console.log(twoSum([1, 2, 3, 4, 5], 8)); // 输出 [2, 4],因为 3 + 5 = 8

 

posted @ 2025-03-09 22:46  我是格鲁特  阅读(60)  评论(0)    收藏  举报