携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
💎一、Leetcode刷题之两数之和
🏆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) 的算法吗?
🏆2.原题链接
来源:力扣(LeetCode) 链接:leetcode.cn/problems/tw…
💎二、解题报告
思路1
循环枚举
🏆1.思路分析
🔑思路: 提示:首先想到的是 双重循环遍历数组中的每一个数,枚举出两个数可组成的所有组合,判断组合中两个数相加是否等于target,如果等于就输出下标。 例如[0,1,2,3] 0,1 0,2 0,3 1,2 1,3 2,3 所有组合
🏆2.代码详解
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(1,len(nums)):
for n in range(i):
if nums[n] +nums[i] == target:
return [n,i]
不过有些不清晰,简单修饰后
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
l = len(nums)
for i in range(l):
for n in range(i+1,l):
if nums[i] +nums[n] == target:
return [n,i]
🏆3.按步骤分析
提示: l = len(nums) 求出数组长度 for i in range(l): 第一个数从下标为0开始,遍历所有数 for n in range(i+1,l): 第一个数从下标为i+1开始,就是读取下标为i+1后面的数 if nums[i] +nums[n] == target: 判断两个数是否相加为target return n,i 返回下标
思路2
字典模拟哈希表
🏆1.思路分析
这次我们不找两个数,找一个数,如果第一个数为x,那么y就等于target-x,我们只需找到y是否在列表中,如果在就输出下标。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
l = len(nums)
for i in range(l):
y = target - nums[i]
for n in range(i+1,l):
if nums[n] == y:
return [n,i]
但是这样还是需要双重循环,没有太大区别! 接下来就用到了字典。 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标. 例如
nums = [10,20,30] print(enumerate(nums)) 结果: (0 ,10) (1 ,20) (2 ,30)
🏆2.代码详解
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dict = {}
for v, k in enumerate(nums):
n = target - k
if n in dict:
return [dict[n], v]
else:
dict[k] = v
🏆3.按步骤分析
dict = {} 建一个空字典 for v, k in enumerate(nums): 循环遍历,为v和k赋值,v为下标,k为数值 n = target - k 求数n if n in dict: return [dict[n], v] 判断数n是否在字典中,如果在就返回下标。 else: dict[k] = v 这一步是将遍历过的数和其下标,添加到字典里。因为刚开始字典为空,所以会将两个数中的第一个数添加字典中k代表的字典的key,v代表字典的value,当遍历第二个数时,查询第一个数在字典中,返回这两个数的>下标!