力扣打卡——1.两数之和

83 阅读3分钟

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 []

知识点

  1. def的基本用法: def function_name(parameters) return 其中,function_name是我们定义的函数名称,在后面调用函数的时候会用到,parameters是我们定义函数的参数,通过我们调用的时候传入即可。

  2. ->List[int]表示该函数应返回一个整数列表 nums: List[int], target:int 表示nums是整数列表,target是整数

  3. len函数: len(variableName)使用len()函数获取数据类型的长度,将数据类型分配给变量,然后将变量名传递给len()函数。这个函数可以计算字符串的字节数,也可以计算字符串的字符数。

  4. 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 []#不存在返回空列表
    

知识点

  1. dict字典的基本使用

概念:是一种可变容器模型,可存储任意类型对象。如字符串、数字、元组等其他容器模型,因为字典是无序的所以不支持索引和切片。

格式:字典名={元素1,元素2,…} 注:元素以键值对存在==key(键值):value(实值)

空字典:字典名={}或者字典名=dict()

注意:

  • key不可以重复,否则只会保留一个
  • value值可以重复
  • key可以是任意的数据类型,但不能出现可变的数据类型,保证key唯一
  • key一般形式为字符串

在该解法中,用到了元素值和对应的下标索引(enumerate())