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

浙公网安备 33010602011771号