leetcode 1. TwoSum 两数之和 python3

写在前边:

本人编程小白自此开启leetcode刷题之旅,计划每日一题。

第一遍会尝试自己动手写,同时输出博客,第二刷的时候会按照博客里的后续优化继续输出代码。任何问题请大家批评指正。


时间:2020-5-09

题目地址:https://leetcode-cn.com/problems/two-sum/

题目难度:Easy

题目描述:

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

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

示例:

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

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


思路:暴力破解

代码段1:解答错误

输入:

[3,3] 6

输出

[0,0,0,0]

预期结果

[0,1]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        result = []
        for i in nums:
            if i > target:
                continue
            else:
                temp = nums.index(i)
                for j in nums[temp + 1:]:
                    if i + j == target:
                        r1 = nums.index(i)
                        r2 = nums.index(j)
                        result.append(r1)
                        result.append(r2)
        return result

原因:存在相同的元素,r2的索引位置错误


修复:修改r2,同时修改测试用例,执行代码通过

代码段2:解答错误

输入:

[3,2,4] 6

输出

[1,1]

预期结果

[1,2]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        result = []
        for i in nums:
            if i > target:
                continue
            else:
                temp = nums.index(i) + 1 
                for j in nums[temp:]:
                    if i + j == target:
                        r1 = nums.index(i)
                        r2 = nums[temp:].index(j) + 1
                        result.append(r1)
                        result.append(r2)
                        return result 

原因:对于r1不是0的,r2的索引位置错误


修复:修改r2,同时修改测试用例,执行代码通过   

代码段3: 解答错误

[-1,-2,-3,-4,-5] -8

输出

[]

差别

预期结果

[2,4]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        result = []
        for i in nums:
            if i > target:
                continue
            else:
                temp = nums.index(i) + 1 
                for j in nums[temp:]:
                    if i + j == target:
                        r1 = nums.index(i)
                        r2 = nums[temp:].index(j) + 1 + r1
                        result.append(r1)
                        result.append(r2)
                        return result         

原因:对于一开始的if判断多余了,没有考虑输入为负数的场景


修复:去掉if判断  

代码段4:通过

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        result = []
        for i in nums:    
            temp = nums.index(i) + 1 
            for j in nums[temp:]:
                if i + j == target:
                    r1 = nums.index(i)
                    r2 = nums[temp:].index(j) + 1 + r1
                    result.append(r1)
                    result.append(r2)
                    return result    

结果:通过

总结:第一次用leetcode刷题,不太熟悉套路,应当对自己的代码输出多找几个测试case


思路4:使用set

代码段4:通过

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(0, len(nums)):
            set1 = nums[i+1:]
            _temp = target - nums[i]
            if(_temp in set1):
                return([i, nums[i+1:].index(_temp) + i + 1])

总结:

  1. 查找的时候使用set去重,并且是在是从i之后加入set,防止重复使用同一个数

思路5:使用哈希表dict

代码段5:通过

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict1 = {}
        for i, element in enumerate(nums):
            dict1[element]  = i
        for j, element in enumerate(nums):
            temp = dict1.get(target - element)
            if temp != j and temp is not None:
                return [j, temp]

总结:

  1. enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。enumerate(sequence, [start=0]) sequence -- 一个序列、迭代器或其他支持迭代对象。start -- 下标起始位置。

思路6:使用哈希表dict,但是在element之前找,省去了循环、重复和target-num=num的判断

代码段6:通过

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict1 = {}
        for i, element in enumerate(nums):
            if dict1.get(target - element) is not None:
                return [dict1.get(target - element), i]
            dict1[element] = i

总结:

  1. 哈希表真香

你可能感兴趣的:(leetcode)