【LeetCode 刷题】 -- 1. 两数之和

1. 两数之和

题目描述:

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

测试示例:

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

拓展:列表与字典常见操作的复杂度

  • 数组
Operation Big-O
index O(1)
append O(1)
pop O(1)
pop(i) O(n)
insert(i, item) O(n)
del O(n)
iteration O(n)
contains / in O(n)
sort O(n log n)
multiply O(nk)
get slice O(k)
del slice O(n)
set slice O(n + k)
reverse O(n)
concatenate O(k)
  • 字典
Operation Big-O
copy O(n)
get item O(1)
set item O(1)
del O(1)
contains / in O(1)
iteration O(n)

解题思路:

判断一个元素是否在另一个集合(字符串、数组、字典等)中时,字符串和数组的时间复杂度为 O(n),字典的时间复杂度为 O(1),因此在设计算法时应尽量使用字典作为存放数据的手段。
回到原题,我们只需要遍历一次数组即可,时间复杂度为 O(n),具体实现如下:

class Solution:
    def twoSum(self, nums, target):
        d = {}  # d 的存放格式为 {数值 : 该数值的角标}
        for i in range(len(nums)):
            if target - nums[i] in d:
                # 跳出循环条件为当前差值存在于字典中
                return [d[target - nums[i]], i]
            d[nums[i]] = i  # 如果原数组存在相同数如 [3, 3],则将该键值更新为后一个相同数的角标
        return []

LeetCode 运行结果:

在这里插入图片描述

发布了5 篇原创文章 · 获赞 0 · 访问量 349

猜你喜欢

转载自blog.csdn.net/qq_40772371/article/details/103542194
今日推荐