Leetcode 1.两数之和
【语录】
“有人相爱,有人夜里看海,有人Leetcode第一题都做不出来” —来自热评
【题目】
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
方法一:【我的解法】
如果一个for循环解决不了的问题,那就两个。
class Solution(object):
def twoSum(self, nums, target):
for x in range(1,len(nums)):
for y in range(0,x):
if nums[x]+nums[y]==target:
return [y,x]
复杂度分析
- 时间复杂度:O(N^2),其中 N 是数组中的元素数量;最坏情况下数组中任意两个数都要被匹配一次
- 空间复杂度:O(1)
方法二:【哈希表】
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
res ={}
for i, j in enumerate(nums):
if (target-j) in res.keys():
return [res[target - j],i]
else:
res[j] = i
Python内置函数之enumerate() 函数
- enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
- 语法:enumerate(sequence, [start=0])
思路分析
- 注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高
- 可以采用建立哈希表的方式,对于单个未知数x,利用哈希表寻找target-x的时间复杂度可以降为O(1)
复杂度分析
- 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x
- 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销
什么是哈希表?
- 哈希表是一种数据结构
- 哈希表表示了关键码值和记录的映射关系
- 与普通的列表不同的地方在于,普通列表仅能通过下标来获取目标位置的值,而哈希表可以根据给定的key计算得到目标位置的值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了