👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。
两数之和 python实现(详细讲解)
一、问题描述
给定一个整数数组 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.1 暴力枚举法
def add_nums(nums, target):
n = len(nums)
for i in range(n):
for j in range(n):
if i != j and nums[i] + nums[j] == target:
return [i, j]
代码分析:
这段代码的函数 add_nums(nums, target)
的目标是找到数组 nums
中和为目标值 target
的两个整数,并返回它们的下标。代码通过嵌套的两层循环遍历数组中的所有可能组合,找到符合条件的两个数,然后返回它们的下标。具体的实现思路如下:
-
获取数组
nums
的长度n
。 -
使用两层嵌套的循环遍历数组的所有可能组合。外层循环变量
i
从 0 到n-1
,内层循环变量j
也从 0 到n-1
,这样会遍历所有可能的组合,包括相同下标的元素的组合。 -
在循环过程中,对于每一对不同的下标
i
和j
,判断nums[i] + nums[j]
是否等于目标值target
。 -
如果找到符合条件的两个数,则立即返回它们的下标
[i, j]
。 -
如果遍历完所有可能组合仍然没有找到符合条件的两个数,则返回空列表。
这种实现思路的问题在于它使用了两层嵌套循环,时间复杂度较高,为O(n^2),其中n为数组的长度。在数组规模较大时,这种解决方法的效率会明显降低。为了提高效率,我们可以采用哈希表的方法,使用一次遍历即可找到符合条件的两个数,时间复杂度降为O(n)。
2.2 哈希表(字典)
def two_sum(nums, target):
# 创建一个空字典用于记录遍历过的元素及其下标
num_map = {}
# 遍历数组
for i, num in enumerate(nums):
# 计算目标值和当前元素的差值
complement = target - num
# 判断差值是否在字典中
if complement in num_map:
# 如果在字典中,则返回对应的两个元素下标
return [num_map[complement], i]
# 将当前元素及其下标添加到字典中
num_map[num] = i
# 如果没有找到符合条件的两个数,则返回空列表
return []
代码分析:
-
遍历给定的整数数组
nums
,对每个元素进行以下操作:- 计算目标值
target
减去当前元素的差值(complement = target - nums[i]
)。 - 检查字典
num_map
中是否存在这个差值complement
,如果存在,说明找到了符合条件的两个数,直接返回它们的下标即可。
- 计算目标值
-
在遍历过程中,将当前元素和它的下标添加到字典
num_map
中,用于记录遍历过的元素及其下标。 -
如果遍历完成后还没有找到符合条件的两个数,则返回空列表。
这种实现思路的关键在于使用字典 num_map
来记录遍历过的元素及其下标,通过字典的查询操作来判断是否找到目标元素。通过这种方法,可以在一次遍历中找到符合条件的两个数,并且时间复杂度为O(n),空间复杂度为O(n),效率较高。