Leecode1 2024.3.12
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]
个人解法
耗时:3251ms
内存:17.02MB
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for idx1,x in enumerate(nums):
for idx2,y in enumerate(nums):
if x+y == target:
if idx1!=idx2:
return [idx1, idx2]
else:
pass
官方给出的暴力写法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i, x in enumerate(nums): # x=nums[i]
for j in range(i + 1, len(nums)): # 枚举 i 右边的 j
if x + nums[j] == target: # 满足要求
return [i, j] # 返回两个数的下标
# 这里无需 return,因为题目保证有解
耗时:1421ms
内存:17.13MB
总结:这里在遍历上进行了优化,查找i右边的元素可以节约一半的搜索时间,同时避免了同一个元素
复杂度分析
时间复杂度:$O(n^2)$, 其中 n 为 nums 的长度。
空间复杂度:$O(1)$。仅用到若干额外变量。
哈希表写法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
idx = {} # 创建一个空哈希表(字典)
for j, x in enumerate(nums): # x=nums[j]
if target - x in idx: # 在左边找 nums[i],满足 nums[i]+x=target
return [idx[target - x], j] # 返回两个数的下标
idx[x] = j # 保存 nums[j] 和 j
耗时:30ms
内存:17.63MB
复杂度分析
时间复杂度:$O(n)$, 其中 n 为 nums 的长度。
空间复杂度:$O(n)$,哈希表需要$O(n)$的空间。
相比暴力做法,哈希表消耗了内存空间,减少了运行时间,空间换时间。
算法分析
哈希表对应字典idx,字典的key对应数组的元素,value对应数组的下标。
第一遍遍历数组元素时,会在字典中寻找是否有满足 target-x 的元素,有则输出下标, 不满足target-x的元素放入字典。
放入字典的数据又可以给下一个遍历的元素进行查找。
使用 target-x 的形式,将两次遍历的判定,改为在一个数据表中进行查询。
(实习、工作太难找了,希望开个头,能坚持下去吧!)