思路
我们要找到i,j,使得num[i]+num[j]=target,然后返回列表[i,j]。
方法一:我们在遇到任何情况时都应该首先考虑暴力解决,即我们使用两个for循环遍历所有数组中两两组合得可能即可,代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
List = []
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j] == target:
List = [i,j]
return List
方法二:使用条件num[i]+num[j]=target。我们从列表得头开始固定一个num[i],然后构造一个数组rest_nums来存储剩下得元素,我们只需要检查元素(target-num[i])是否在rest_nums中即可,下面是代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
j = -1
for i in range(len(nums)-1):
rest_nums = nums[i+1:]
if (target - nums[i]) in rest_nums:
j = rest_nums.index(target-nums[i])
if j >= 0:
return [i,j+i+1]
- Tips:索引问题要注意,方法二相当于把数组拆开进行完操作后在合并,所以索引如果不考虑对,返回得是错
- 具体得,j表示在rest_nums中得索引,rest_nums数组相当于接在num[i]之后得数组。所以当j=0时,所要元素在原数组nums得索引为i+1;j=1时,所要元素在原数组nums得索引为i+2。以此类推。
- 真的不会,举个简单栗子就可以了
方法三:哈希表
- 将数组中的值作为哈希表中的key值
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
map_a = dict()
k = len(nums)
for i in range(0, k): #一边将列表中的数添加到字典中,一边判断两数之差是否存在于字典中
temp = target - nums[i]
if temp in map_a : # 判断步骤
return [map_a[temp], i]
map_a[nums[i]] = i # 添加步骤(切记先判断再添加,以免key冲突)
# 举例说明为什么要先判断再添加
假如现在数组为[1,2,2,5],target=4。
当for循环再次碰到2时,会将之前的2覆盖掉,这样就找不到了。
要注意这不算哈希冲突,哈希冲突指的是key不同,value相同。而这里是key相同,value相同,应选择舍弃。