给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
我使用的是Go语言进行编写
func twoSum(nums []int, target int) []int {
for i :=0 ; i<len(nums) ; i++{
for j :=i+1 ; j<len(nums); j++{
if nums[i] + nums[j] == target{
return []int{i, j}
}
}
}
return nil
}
- 外层循环:遍历数组中的每一个元素,用变量
i
表示当前元素的索引。 - 内层循环:从
i+1
开始,确保不会重复使用同一个元素,并且每个组合只检查一次。用变量j
表示内层循环中当前元素的索引。 - 检查和:对于每一对元素
nums[i]
和nums[j]
,计算它们的和,并检查是否等于目标值target
。 - 即时返回:如果找到了一对元素,它们的和等于
target
,则立即返回这对元素的索引[i, j]
。 - 未找到的情况:如果遍历完整个数组后仍未找到符合条件的一对元素,则返回
nil
,表示没有找到解。
时间复杂度为 O(n^2)
LeetCode更加简洁的方法是使用哈希表,我也尝试写了一遍
func twoSum(nums []int, target int) []int {
hashTable := map[int]int{}
for i :=0 ; i<len(nums) ; i++{
x := nums[i]
if j, ok := hashTable[target - x];ok{
return []int{i, j}
}
hashTable[x] = i
}
return nil
}
-
初始化哈希表:创建一个空的哈希表
hashTable
,用于存储遍历过的数字及其对应的索引。键是数组中的数值,值是该数值在数组中的索引。 -
遍历数组:使用
for
循环遍历数组nums
的每一个元素。对于每个元素x = nums[i]
:- 计算互补数:计算出需要找到的另一个数(即
target - x
),这个数与当前数x
相加应该等于目标值target
。 - 检查哈希表:查看哈希表中是否已经存在这个互补数。如果存在,说明我们找到了一对满足条件的数,立即返回它们的索引
[i, j]
,其中j
是之前存入哈希表中的互补数的索引。 - 更新哈希表:如果未找到互补数,则将当前元素
x
及其索引i
存入哈希表中,以便后续迭代时可以利用这些信息进行快速查找。
- 计算互补数:计算出需要找到的另一个数(即
-
返回结果:如果遍历完整个数组后仍未找到符合条件的一对数,则返回
nil
,表示没有找到解。
时间复杂度:O(N)