返回
剑指 Offer 002. 两数之和
见解分享
2023-11-30 18:56:04
剑指 Offer 002. 两数之和
给定一个长度为 n 的整数数组和一个目标和,从数组中找出两个数字,使得它们的和等于目标和。输出这两个数字的下标。
你可以假设每个输入只有一个解决方案,并且同一个元素不能被重复使用。
示例 1:
输入:nums = [2, 7, 11, 15], target = 9
输出:[0, 1]
解释:nums[0] + nums[1] = 2 + 7 = 9,所以返回下标 [0, 1]。
示例 2:
输入:nums = [3, 2, 4], target = 6
输出:[1, 2]
解释:nums[1] + nums[2] = 2 + 4 = 6,所以返回下标 [1, 2]。
示例 3:
输入:nums = [3, 3], target = 6
输出:[0, 1]
解释:nums[0] + nums[1] = 3 + 3 = 6,所以返回下标 [0, 1]。
提示:
- 2 <= nums.length <= 10^4
- -10^9 <= nums[i] <= 10^9
- -10^9 <= target <= 10^9
- 只存在一个有效答案
解题思路
这道题的解题思路很简单,我们可以使用哈希表来存储已经遍历过的数字及其索引。当我们遍历数组时,对于每个元素,我们可以检查哈希表中是否包含 (target - nums[i])。如果包含,则意味着我们已经找到了两个数字,它们的和等于目标和。
为了提高算法的效率,我们可以使用哈希表来存储已经遍历过的数字及其索引。当我们遍历数组时,对于每个元素,我们可以检查哈希表中是否包含 (target - nums[i])。如果包含,则意味着我们已经找到了两个数字,它们的和等于目标和。
代码实现
/**
* 给定一个长度为 n 的整数数组和一个目标和,从数组中找出两个数字,使得它们的和等于目标和。输出这两个数字的下标。
*
* 你可以假设每个输入只有一个解决方案,并且同一个元素不能被重复使用。
*
* 示例 1:
*
* 输入:nums = [2, 7, 11, 15], target = 9
* 输出:[0, 1]
* 解释:nums[0] + nums[1] = 2 + 7 = 9,所以返回下标 [0, 1]。
*
* 示例 2:
*
* 输入:nums = [3, 2, 4], target = 6
* 输出:[1, 2]
* 解释:nums[1] + nums[2] = 2 + 4 = 6,所以返回下标 [1, 2]。
*
* 示例 3:
*
* 输入:nums = [3, 3], target = 6
* 输出:[0, 1]
* 解释:nums[0] + nums[1] = 3 + 3 = 6,所以返回下标 [0, 1]。
*
* 提示:
*
* 2 <= nums.length <= 10^4
* -10^9 <= nums[i] <= 10^9
* -10^9 <= target <= 10^9
* 只存在一个有效答案
*/
const twoSum = (nums, target) => {
// 创建一个哈希表来存储已经遍历过的数字及其索引
const hashTable = {};
// 遍历数组
for (let i = 0; i < nums.length; i++) {
// 计算目标和减去当前元素
const diff = target - nums[i];
// 检查哈希表中是否包含目标和减去当前元素
if (hashTable[diff] !== undefined) {
// 如果包含,则返回两个数字的下标
return [hashTable[diff], i];
}
// 将当前元素及其索引添加到哈希表中
hashTable[nums[i]] = i;
}
// 如果没有找到两个数字之和等于目标和,则返回一个空数组
return [];
};
def twoSum(nums, target):
# 创建一个哈希表来存储已经遍历过的数字及其索引
hashtable = {}
# 遍历数组
for i, num in enumerate(nums):
# 计算目标和减去当前元素
diff = target - num
# 检查哈希表中是否包含目标和减去当前元素
if diff in hashtable:
# 如果包含,则返回两个数字的下标
return [hashtable[diff], i]
# 将当前元素及其索引添加到哈希表中
hashtable[num] = i
# 如果没有找到两个数字之和等于目标和,则返回一个空列表
return []
复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。
- 空间复杂度:O(n),其中 n 是数组的长度。
总结
这道题的解题思路很简单,我们可以使用哈希表来存储已经遍历过的数字及其索引。当我们遍历数组时,对于每个元素,我们可以检查哈希表中是否包含 (target - nums[i])。如果包含,则意味着我们已经找到了两个数字,它们的和等于目标和。