题目概述
题目链接:https://leetcode-cn.com/problems/two-sum/
解法一:遍历法
思路
遍历数组中的元素nums[i],看target -nums[i]是否也在数组中。
代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
if target-nums[i] in nums:
if target-nums[i]==nums[i] and nums.count(nums[i])==1 #如果差与被减数相等且数组中只有一个这个数时,不满足条件(因为重复利用)
continue
else:
j=nums.index(target-nums[i],i+1) #找到的数一定在nums[i]后面
return [i,j]
break
因为全部遍历,所以耗时较长。
解法二:部分遍历
思路:根据差与减数的位置,可以从减数的左和右进行履历。
# 一二行参照解法一,一模一样,后面不再叙述。
for i in range(len(nums)):
if target-nums[i] in nums[:i]:#切片法取左不取右,所以不用考虑相等的情况
j=nums.index(target-nums[i])
return [j,i]
比较于方法一有较大改进。
解法二:结合字典.
思路:可以边遍历的时候把数组中的值和索引放到字典里,通过字典的get()来找索引。
代码:
for i,num in enumerate(nums):
HashMap[num]=i
for i in range(len(nums)):
j=HashMap.get(target-nums[i]) #把在字典里的值(原来的索引)给j
if j is not None and j!=i:
return([i,j])
break
优点:速度更快。