两数求和

给定一个整数数组 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
}