Python实现与LeetCode--数组
LeetCode
两数之和
方法一:两遍循环
以空间换取时间,循环这个nums
,用字典(hash table)来记录nums
,以nums
的值为key
,对应的值的数组下标为value
(此时当数组内有相同的值时,字典会自动舍去多余的只保留一个)
第二次循环这个nums
,求出 complement = target - nums[i]
,判断complement
是否作为key
存在这个字典中,并判断这个complement
是否是nums[i]
,即本身
class Solution:
def twoSum(self, nums, target):
nums_dict = {}
for index, v in enumerate(nums):
nums_dict[v] = index # 注意,此方式会自动消掉nums相同的元素,只保留一个
for i in range(len(nums)):
complement = target - nums[i]
if complement in nums_dict and nums_dict.get(complement, None) != i:
return [i, nums_dict.get(complement)]
return None
if __name__ == "__main__":
nums = [1, -8, 7, 4, 6]
solution = Solution()
res = solution.twoSum(nums, -4)
print(res)
方法二:一遍循环
class Solution:
def twoSum(self, nums, target):
nums_dict = {}
length = len(nums)
for i in range(length):
complement = target - nums[i]
if complement in nums_dict:
return [i, nums_dict.get(complement)]
else:
nums_dict[nums[i]] = i
return None
if __name__ == "__main__":
nums = [2, 7, 11, 15]
solution = Solution()
res = solution.twoSum(nums, 9)
print(res)
复杂度分析:两种方法复杂度是一样的,方法二是方法一的一种优化
时间复杂度:
O(n)
,只是遍历了数组一次空间复杂度:
O(n)
, 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。