1. 我的解答
class Solution(object):
def twoSum(self, nums, target):
maps = {}
for i in range(len(nums)):
maps.update({str(i):nums[i]})
def getIndex(values):
assert len(values) == 2
print(values)
if values[0] == values[1]:
indexes = [i for i ,a in enumerate(maps.values()) if a == values[0]]
return sorted([int(maps.keys()[indexes[0]]), int(maps.keys()[indexes[1]])])
else:
index0 = maps.keys()[maps.values().index(values[0])]
index1 = maps.keys()[maps.values().index(values[1])]
return sorted([int(index0), int(index1)])
sort_nums = sorted(nums)
nums_small = [x for x in sort_nums if x <= target - sort_nums[0]]
nums_middle = [x for x in nums_small if x == target/2]
if len(nums_middle) == 2 and nums_middle[0] + nums_middle[1] == target:
return getIndex(nums_middle)
nums_left = [x for x in nums_small if x < target/2]
nums_right = [x for x in nums_small if x > target/2]
print("l:", nums_left)
print("r:", nums_right)
for l in nums_left:
result = [r for r in nums_right if l+r == target]
if len(result) == 1:
result = getIndex([l, target-l])
return result
return None
2. 大神的代码
class Solution(object):
def twoSum(self, nums, target):
nums_dict = dict()
for i, v in enumerate(nums):
if v not in nums_dict:
nums_dict[v] = i
if target - v in nums_dict:
k = nums_dict[target - v]
if k < i:
return [k, i]
我的思路是,先保存索引,再排序,然后对半查找,对于6=3+3的情况,需要单独判断。
大神的思路是,在建立索引的时候,同时判断,而且是利用target-v是否在dict的方式,而不是两次遍历求和判断。
3. 差距
- 尽量避免重复多个循环,能同时做的事情,绝不分开做。
- 当要进行某种遍历时,要选择遍历变量的所在集合尽可能小的方法遍历。