欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode1:两数之和 python3解法

程序员文章站 2022-07-14 17:28:26
...

题目描述:

给定一个整数数组 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列表基础