给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法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
}
#python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0,len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
方法二:求两个数字的和是target,反过来判断,如果target减去一个值,判断另一个在列表中位置
注意点:减去的值只需要在 i 后面遍历就可
还有就是返回时候为啥不能全局遍历呢,为 了避开([3,3] 6)这种情况。
最后是部分获取索引的,所以需要把之前的i加上,再加上1是遍历从0开始的。
#python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0, len(nums)):
if target - nums[i] in nums[i+1:]:
return [i,nums[i+1:].index(target - nums[i])+i+1]
方法三:用python中的字典解决
注意: 把字典中值和位置存储到字典中,值是key,位置是value.
最后if判断时候,需要排斥 i=j情况就是防止([1,3,3,7] 6)这种情况。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
numDict = {}
for i, item in enumerate(nums):
numDict[item] = i
for j in range(0, len(nums)):
k = numDict.get(target - nums[j])
if k and k != j:
return [j, k]
//golang
func twoSum(nums []int, target int) []int {
var numMap = make(map[int]int)
for i := 0; i <len(nums); i++ {
diff := target - nums[i]
v, ok := numMap[diff]
if ok {
return []int{v, i}
}else{
numMap[nums[i]] = i
}
}
return nil
}