菜鸟python刷力扣题__1_两数之和

本文深入探讨了经典的“两数之和”问题,通过三种不同的解决方案,包括暴力循环、首尾递进和转换思路,详细分析了每种方法的时间和空间效率。从基本原理到实践应用,为读者提供了全面的理解。
一.两数之和

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

2.示例:

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

3.理解:
找到序列nums中两个数,二者和的值等于target,然后返回两个数在序列中的下标(两数不同)。题目本身不难,但是尽可能缩小时间和内存需要仔细斟酌。

4.答题:
4.1暴力循环:使用两层循环遍历,时间复杂度O(n2)。

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

提示为:
在这里插入图片描述
查看了一下发现是最后一个用例的序列中数很多,看来直接用双重循环满足不了python3的时间要求。
不过在python里可以,执行用时 :5896 ms,内存消耗 :12.5 MB,显然用时太长。

4.2首尾递进:利用sorted方法和lambda表达式得到排序的下标序列。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        le = len(nums)
        a = sorted(range(le), key=lambda i: nums[i])
        low = 0
        high = len(nums)-1
        result = nums[a[low]] + nums[a[high]]
        while result != target:
            if result < target:
                low+=1
            elif result > target:
                high-=1
            result = nums[a[low]] + nums[a[high]]
        return [a[low], a[high]]

用时:56ms,内存消耗14.4MB

4.3 转换思路
转换思路,要找两个数,使它们之和为target,不妨设num[i]+num[2]=target,那么就有num[1]=target-num[2],num[i]是序列里的数,就只要判断target-num[2]是否在序列中即可。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        le = len(nums)
        for i in range(le-1):
            slice1 = nums[i+1:] 
            #此处如果直接不用切片直接判断整个序列的话会需要更多时间
            if target - nums[i] in slice1:
                j = slice1.index(target - nums[i])+1+i
                #此处加上i+1是因为向后切片造成的index返回的索引值在变化
                break
        return [i, j]

用时956ms,消耗内存13.9MB
刚才我们是从当前的i向后切片,其实也可以往前切片:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        le = len(nums)
        for i in range(1, le):
            slice1 = nums[:i]
            if target - nums[i] in slice1:
                j = slice1.index(target - nums[i])
                break
        return [j, i] #注意此时输出索引j在前

用时412ms,消耗内存14MB

总结参考了很多大佬的解法,泪奔,发现自己更菜了emm…
点我查看力扣源题目及解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值