1.两数之和
1.1题目
给定一个整数数组 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) 的算法吗?
1.2题解
1.2.1暴力枚举
思路:枚举数组中的每一个数x,寻找数组中是否存在target-x。 去冗余:当使用遍历整个数组的方式寻找target-x时,需要注意到每一个位于x之前的元素都已经和x匹配过,因此不需要再次进行匹配。而每一个元素不能被使用两次,所以我们只需要在x后面的元素中寻找target-x。
代码:
class Solution:
def twoSum(self, nums: List[int], target: int)-> List[int]:
n = len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[i] + nums[j] == target:
return[i,j]
return []
知识点:
-
def的基本用法: def function_name(parameters) return 其中,function_name是我们定义的函数名称,在后面调用函数的时候会用到,parameters是我们定义函数的参数,通过我们调用的时候传入即可。
-
->List[int]表示该函数应返回一个整数列表 nums: List[int], target:int 表示nums是整数列表,target是整数
-
len函数: len(variableName)使用len()函数获取数据类型的长度,将数据类型分配给变量,然后将变量名传递给len()函数。这个函数可以计算字符串的字节数,也可以计算字符串的字符数。
-
range函数: 左闭右开,可指定起始位置、终止位置以及步长 e.g.range(0,10,2) 注意事项: 使用参数都是整形,不能给出浮点数序列; 当start参数省略时,step参数也必须省略; step可以是负数,但相应的start和end的大小排列需要注意,end应该小于start; 步长不能为0; range()的返回值是range
1.2.2哈希表
思路:
注意到1.2.1中的时间复杂度较高的原因是寻找 target-x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找到它的索引。 使用哈希表,可以将寻找 target-x 的时间复杂度降低到从O(N)降低到O(1)。 我们创建一个哈希表,对于每一个x,首先查询哈希表中是否存在 target-x ,然后将x插入到哈希表中,即可保证不会让x和自己匹配。
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()#创建哈希表
for i, num in enumerate(nums):#遍历列表
if target - num in hashtable:#检测target-num在不在哈希表中
return [hashtable[target - num], i]#有的话就返回对应的下标
hashtable[nums[i]] = i#把num列表的元素添加到哈希表中
return []#不存在返回空列表
知识点:
- dict字典的基本使用
概念:是一种可变容器模型,可存储任意类型对象。如字符串、数字、元组等其他容器模型,因为字典是无序的所以不支持索引和切片。
格式:字典名={元素1,元素2,…} 注:元素以键值对存在==key(键值):value(实值)
空字典:字典名={}或者字典名=dict()
注意:
- key不可以重复,否则只会保留一个
- value值可以重复
- key可以是任意的数据类型,但不能出现可变的数据类型,保证key唯一
- key一般形式为字符串
在该解法中,用到了元素值和对应的下标索引(enumerate())