LeetCode菜鸟从零开始——第一题:两数之和

LeetCode菜鸟从零开始——第一题:两数之和

问题描述

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

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

问题解答(python)

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        used = {}
        length = range(len(nums))
        for i in length:
                t = target - nums[i]
                if t in used:
                    return[used[t],i]
                used[nums[i]] = i

问题总结

在解这道题时,我遇到的问题(排除代码本身有问题卡在[2,7,11,15])主要就是[3,2,4]target = 6,在我外层用for遍历nums时,内层用if…in…判断目标是否在nums中,就会遇到在本次循环中nums[i] = 3,t = 6 - 3 = 3,而3也确实在nums里,但是答案[0,0]却不是正确答案(3被重复使用)。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        answer = []
        i = 0
        flag = 0
        for i in range(len(nums)):
            a = nums[i]
            j = i+1
            for j in range(len(nums)):
                b = nums[j]
                if a + b == target:
                    answer.append(i)
                    answer.append(j)
                    flag = 1
                    break
            if flag == 1:
                break
        return answer

于是我改用双循环,但是时间复杂度太高,用时3332ms

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        length = len(nums)
        for i in range(length):
            t = target - nums[i]
            for j in range(i+1,length):
                if t == nums[j]:
                    return[i,j]

在参考了大手子的解题后,因为题中说你可以假设每种输入只会对应一个答案,为了避免重复使用,我决定使用Python中的字典功能,将使用过的数字存入字典,存入的数值作为key,数值在nums中的索引位置作为value,使用if…in…对字典进行查找可以大幅度提升查找效率,用时56ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值