1. 题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
注意题目中返回的是数组下标。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
2. 解答
最容易想到的是暴力解法,显然可行但没必要。
2.1 错误解答(自己的)
- 首先,题目要求返回下标,因此应保存数的对应下标,Python中使用字典进行保存下标这一操作。字典形式为“数:下标”
- 其次,想到可以通过对数组排序后,设置首尾指针,若首尾指针和大于target,则尾指针左移;若和小于target,则首指针右移;若和等于target,则找到对应两数,在字典中找到对应下标,返回结果。
思路转代码,内心窃喜
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
if len(nums) < 2:
return None
d = {}
for i in xrange(len(nums)):
d[nums[i]] = i
nums.sort()
left = 0
right = len(nums) - 1
two = nums[left] + nums[right]
while left < right and two != target:
if two < target:
left += 1
else:
right -= 1
two = nums[left] + nums[right]
return [d[nums[left]], d[nums[right]]]
- 运行出错,当nums=[3,3]时,按照上述代码返回是[1,1]。忽略了数组中存在相同元素的情况。
2.2 正确解答(别人的)
以下思路为根据别人的正确代码复述思路。至于别人是谁,我也不知道,LeetCode上的
- 首先,题目要求返回数组下标,因此应保存数的对应下标,Python中使用字典进行保存下标这一操作。字典形式为“数:下标”
(我的这条思路是正确的 窃喜√) - 依次遍历数组,若“target-当前数”在字典中,则找到对应两数,返回当前下标,以及在字典中找到“target-当前数”对应的下标;若“target-当前数”不在字典中,则在字典中保存“当前数:当前数的下标”。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d = {}
for i in xrange(len(nums)):
other = target - nums[i]
if other in d:
left = d[other]
right = i
return [left, right]
d[nums[i]] = i
return None
2.3 对比
不要想复杂了,其实挺容易的,离正确只差一丢丢,这一丢丢就是菜鸟与大佬的差距8
博文为记录用,欢迎留言交流。