【5分钟力扣】01. 用python3实现两数之和

文章目录

    • 一、前言
    • 二、题目
    • 三、暴力解题法
    • 四、容器缓存法
    • 五、相关知识点

一、前言

最近在刷力扣上的题目,之前也刷过很多次,一边刷一边忘,很是苦恼。

为什么边学边忘,很大程度是没有应用场景,只是被动的进行填鸭式学习。

为了提高学习效率,觉得还是得坚持写博客,一方面强化记忆,第二强迫自己创造应用场景,学习知识的同时也在产生知识。

【5分钟力扣】01. 用python3实现两数之和_第1张图片

二、题目

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

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

示例:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

三、暴力解题法

3.1 思路:

用for循环将数组中的元素和后面的元素分别相加,看是否等于 target ,如果不等于 target,那么就继续拿数组里的第二个数字和后面的数字相加;不停的去一个个试…直到等于target,返回这2个数字所在的下标。

nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
    n = len(nums)  # # 获取nums的长度,是4
    for x in range(n): # # 外层循环先取出下标0,对应着数组里的第一个数字
        for y in range(x+1, n):  # 内层循环取出下标1,对应着数组里的第二个数字
            if nums[x] + nums[y] == target:  # 如果满足条件则return下标
                return [x, y]
            else:   # 不满足则跳过当前循环
                continue
    return None  # 都不满足,则返回None

a = twoSum(nums,target)
print(a)

【5分钟力扣】01. 用python3实现两数之和_第2张图片
3.2 总结:

提交力扣,这种解法比较耗时和占用内存,继续优化。

四、容器缓存法

4.1 思路

  • 先遍历所有的数组元素_—— nums[i],计算 target - nums[i],并将结果缓存到容器中,在后续循环中,如果再看到这个值,则返回两者的下标位置。

  • 空间复杂度:O(n)

  • 时间复杂度:O(n)

# 容器缓存法

nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
    lis = {}  # 设置一个容器字典,用来缓存结果和下标
    for index, num in enumerate(nums):  # 获取数值和下表
        result = target - num  # 结果
        if num in lis:  # 如果数值存在容器中,则返回第一个数值下标,和当前数值下标
            return [lis[num], index]
        lis[result] = index  # 将结果作为容器的key,数值的下标作为value
    return None

print(twoSum(nums,target))

【5分钟力扣】01. 用python3实现两数之和_第3张图片

4.2 总结:

用时缩短接近10倍

五、相关知识点

容器中的操作时间复杂度: https://wiki.python.org/moin/TimeComplexity

你可能感兴趣的:(金鞍少年的刷题之路)