好久没刷题了,每次刷都有新的领悟。
这次选择刷leetcode top100
刷leetcode top100 第一轮 第一题
前言
“故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。”------《劝学》
思路01:暴力破解
两个循环
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0,len(nums)):
for j in range(i, len(nums)):
if nums[i] + nums[j] == target and nums[i] != nums[j]:
return [i,j]
复杂度分析
时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
空间复杂度:O(1)。
思路02:哈希表
把所有数字都放入一个字典中,然后遍历nums,如果字典里有target-nums[i],那就返回i和这个数的索引
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
map = {}
for i in range(0,len(nums)):
sub_num = target - nums[i]
if sub_num in map:
return [map[sub_num],i]
else:
map[nums[i]] = i
复杂度分析
时间复杂度:O(N),其中 NN 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。
发布!