leetCode 1.两数之和

1.两数之和

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

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

示例:

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

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

1.1我的解题

  1. 计算数组列表的长度 定义j= -1
  2. 遍历长度, 如果target - nums[i] 的值 也在 nums数组中,进行判断
    • 计算nums中(target-nums[i])出现的次数,如果为1且 target-num[i] 的值等于nums[i],(代表找到的是自己本身,例: 3= 6 - 3 ) ,跳出当前循环,继续下一个循环
  3. 如果不为本身,则 使用nums.index()对target-nums[i]进行取下标, 且 i+1 ,断开循环
  4. 如果j>0 则表示 至少有解,返回列表[i,j]
  5. 否则返回空列表

class Solution:
    def twoSum(self, nums, target):
        j = -1
        lens = len(nums)
        for i in range(lens):
            if (target - nums[i]) in nums:
                if nums.count(target - nums[i]) == 1 and target - nums[i] == nums[i]:
                    continue
                else:
                    j = nums.index(target-nums[i], i + 1)
                    break
        if j> 0:
            return [i, j]
        else:
            return []
        

方法二:

解题思路是在方法一的基础上,优化解法。想着,num2 的查找并不需要每次从 nums 查找一遍,只需要从 num1 位置之前或之后查找即可。但为了方便 index 这里选择从 num1 位置之前查找

def twoSum(nums, target):
    lens = len(nums)
    j=-1
    for i in range(1,lens):
        temp = nums[:i]
        if (target - nums[i]) in temp:
            j = temp.index(target - nums[i])
            break
    if j>=0:
        return [j,i]

方法三:用字典模拟哈希求解

参考了大神们的解法,通过哈希来求解,这里通过字典来模拟哈希查询的过程。
个人理解这种办法相较于方法一其实就是字典记录了 num1 和 num2 的值和位置,而省了再查找 num2 索引的步骤

def twoSum(nums, target):
    hashmap={}
    for ind,num in enumerate(nums):
        hashmap[num] = ind
    for i,num in enumerate(nums):
        j = hashmap.get(target - num)
        if j is not None and i!=j:
            return [i,j]

作者:lao-la-rou-yue-jiao-yue-xiang
链接:https://leetcode-cn.com/problems/two-sum/solution/xiao-bai-pythonji-chong-jie-fa-by-lao-la-rou-yue-j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法四:

类似方法二,不需要 mun2 不需要在整个 dict 中去查找。可以在 num1 之前的 dict 中查找,因此就只需要一次循环可解决

def twoSum(nums, target):
    hashmap={}
    for i,num in enumerate(nums):
        if hashmap.get(target - num) is not None:
            return [i,hashmap.get(target - num)]
        hashmap[num] = i #这句不能放在if语句之前,解决list中有重复值或target-num=num的情况

作者:lao-la-rou-yue-jiao-yue-xiang
链接:https://leetcode-cn.com/problems/two-sum/solution/xiao-bai-pythonji-chong-jie-fa-by-lao-la-rou-yue-j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不过方法四相较于方法三的运行速度没有像方法二相较于方法一的速度提升。运行速度在 70ms 多

posted on 2020-07-05 21:44  sunnywillow  阅读(70)  评论(0编辑  收藏  举报