第一次做,优化不够好。
方法一:暴力遍历
class Solution(object):
def twoSum(self, nums, target):
for i in range(len(nums)):
# 这里用i+1:因为遍历的是同一个列表,不存在遍历元素缺失的问题,
# 从i+1开始反而会让程序运行更快速
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
if i == j:
# 如果下标值相同,证明是同一个元素,则忽略这次,继续遍历。
continue
else:
return [i, j]`
耗时:4984ms
后看了大家的解答,学到以下两种方法:
方法二:哈希查找
class Solution(object):
def twoSum(self, nums, target):
hashmap = {}
for i, num in enumerate(nums):
# 先判断再加入,防止重复元素加入后覆盖之前的字典
# 也可以直接取到第二个重复元素的下标
if target - num in hashmap:
return [hashmap[target - num], i]
hashmap[num] = i
耗时:60ms
方法三:
# 新建容器
class Solution(object):
def twoSum(self, nums, target):
x = set({})
l = len(nums)
for i in range(l):
if target - nums[i] in x:
return [i, nums.index(target - nums[i])]
# 集合添加元素用add()
x.add(nums[i])
耗时:32ms
这个题的难点在于,如果两个元素相同,如何取到第二个元素的下标值,通过新建容器的方法,将元素放在两个容器里,(如果有相同元素)优先取到第二个元素的下标,再通过简单的index函数获取到第一个元素的下标。最后一定要写成
nums.index(target - nums[i])
的形式,不能只考虑相同元素而忽略两个元素不同时的情况
,要考虑全面。