两数之和(twoSum)

给定一个整数数组  nums 和一个目标值  target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

        给定  nums  =  [2,  7,  11,  15],  target  =  9

        因为  nums[0]  +  nums[1]  =  2  +  7  =  9
        所以返回  [0,  1]

方法一、两层循环,暴力解法

        思路:迭代每一个数,找出所有情况的和,和  target  做对等比较
        代码如下:(twoSum_violence)


def twosum_violence(nums, target):
    length = len(nums)
    for i in range(0, length):
        for j in range(0, length):
            if i == j:
                continue
            if (nums[i] + nums[j]) == target:
                return [i, j]
    return None
方法二、哈希表

        思路:先遍历一遍,准备一个哈希表,之后再遍历一遍寻找差值是否在哈希表中
        哈希表:哈希的精髓就是,能够快速  确定是否存在某个key  和  获取该  key  的值  而不需要进行耗时的迭代
        数学的逆向思维:  不从  “得到和  ——>  与target  进行比较”而是  “得到差——>  确定差是否存在?”
                精髓在于  有  “是否存在”,于是  第一遍,生成  map,  第二遍,判断差是否在  map中

        代码如下:(twosum_map)

def twosum_map(nums, target):
    length = len(nums)
    value_index_map = {nums[i]: i for i in range(0, length)}
    for num in nums:
        diff = target - num
        if diff in value_index_map:
            i = nums.index(num)
            j = value_index_map[diff]
            if i != j:
                return [i, j]
    return None
方法三、哈希表PRO

        思路:只进行一遍迭代,边迭代边生成哈希表
        假设  迭代顺序是从左往右的,每个迭代的数,只去和记录表中非自身的节点做比较,其实是和自身左边的数做比较。
        当我们遍历到某个数时,判断差是否存在哈希表中,虽然哈希表中只有当前数往左的数,但即使正确结果在右边的
        某个数,当迭代到右边那个数时,差值也能在map中找到
        同样是逆向思维:因为  A  +  B  =  target,既然可以通过  target,  A  找  B,  那也可以通过,target,  B  找到  A
        代码如下:(twosum_map_pro)

def towsum_map_pro(nums, target):
    length = len(nums)
    num_index_map = dict()
    for i in range(0, length):
        num = nums[i]
        diff = target - num
        if diff in num_index_map:
            return i, num_index_map[diff]
        num_index_map[num] = i
    return None