leetcode1:两数之和 python3解法

题目描述:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

作答:

方法1:
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n): # 0~n-1
            y = target-nums[i]
            if y in nums:
                if (nums.count(y) == 1) and (y == nums[i]): #避免同一个元素用两次,比如2+2=4
                    continue
                else:
                    return i, nums.index(y, i+1) #在i之后寻找y的索引值

执行用时:1040ms,内存消耗:14.6MB

方法2:来自方法1的改编,使用切片
def twoSum(nums, target):
    for i in range(len(nums)):
        temp_list = nums[:i]  #为什么不能是[(i+1):],因为i是最后一个就不行哒
        y = target - nums[i]
        if y in temp_list:
            return temp_list.index(y),i

执行用时:444ms,内存消耗:14.7MB

方法3:使用字典模拟哈希。

利用字典,遍历列表中的元素时,将每个元素需要的值(target-num[i])作为key,当前元素的下标i存入字典中,理解为第i个元素需要的值在字典中,此后的遍历先看当前的元素是否在字典中被需要。是,则返回需要元素的下标和当前元素的下标。否则,将target-num[i]:i存入字典中

def twoSum(nums, target):
    hash = {}  #定义一个字典
    for i in range(len(nums)):
        y = target - nums[i]
        if nums[i] in hash: #如果当前元素在字典的key中,即被需
            return hash[nums[i]], i
        else:
            hash[y] = i  #将当前元素所需要的值和当前元素的下标存入字典中     

执行用时:60ms,内存消耗:15MB

提交成功,但是测试会存在问题的一种方法
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n):
            y = target-nums[i]
            if y in nums and nums.index(y) != i:
                return i, nums.index(y)

测试用例:
[3,3] 6
返回:[1,0]
预期:[0,1]

这种方法是方法1的原型。

使用字典的方法3,是我目前万万想不到的,看了大佬们的解法,我还想了一会儿,哎。
python也是才学,这次的题让我意思到python的列表我还有很多需要解决的问题,所以在逐步整理列表的知识。有需要可以看一看。

python列表基础

你可能感兴趣的:(leetcode)