两数之和
题目描述:
给定一个整数数组 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]
思路分析
最容易想到的做法自然是遍历数组,用两层循环查找,找到目标后将结果保存,退出结束。但此类复杂度为n方,如果面试这么写的话肯定不符合要求的。
我初次接触这个题的时候,还喜欢用另一种方法,即单层循环遍历数组,然后用python的in方法做判断,用判断if target-nums[i] in nums来寻找第二个数,虽然这么写可以在LeetCode提交结果上发现时空复杂度明显降低,但这种做法和上面方法无本质区别,因为in方法查找数组依然是O(n)的复杂度,只不过python自带的方法导致它更快一些。
最佳方法:使用哈希表,以空间换时间。
代码:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
#定义个字典
hashmap={}
for i,n in enumerate(nums):
if target-n in hashmap:#如果target-n也出现过
return [i,hashmap[target-n]]
#直接返回这个索引,和另一个值对应索引
hashmap[n]=i #将该值存入哈希表,注意该值为字典的键,该索引为字典的值
需要注意的是,因为我们使用的字典,此时if target-n in hashmap语句复杂度就是O(1)的,这也是哈希表的特性,与列表不同。
这样一来,时空复杂度都是O(n),问题得到较好解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了