题目链接
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
题目描述
代码初步
- 我的思路:利用哈希表将列表的值作为key,索引作为value。判断target - numbers[i]]是否在哈希表中,可知是否有相应的两个值相加等于目标值
- 问题:hash_table[numbers[i]] = i 必须放在try except 语句后面,如果放在其前面,当目标数为两个值相同的数相加时会出现计算问题。例如:[2,2,3,7], target=4,输出会是【2,2】,正确输出为【1,2】
- 没有利用上已经是升序排序的数组的条件
- 复杂度: 时间复杂度:O(n) 时间和 空间复杂度:O(n)
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
hash_table = {}
arr = []
for i in range(len(numbers)):
try:
hash_table[target - numbers[i]]
except KeyError:
pass
else:
arr = [hash_table[target - numbers[i]]+1, i+1]
hash_table[numbers[i]] = i
return arr
代码欣赏
- 方法:双指针法
使用两个指针,初始分别位于第一个元素和最后一个元素位置,比较这两个元素之和与目标值的大小。如果和等于目标值,我们发现了这个唯一解。如果比目标值小,我们将较小元素指针增加一。如果比目标值大,我们将较大指针减小一。移动指针后重复上述比较知道找到答案。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
left = 0
right = len(numbers)-1
while left<right:
sum = numbers[left]+numbers[right]
if sum<target:
left+=1
elif sum>target:
right-=1
else:
return [left+1,right+1]
return []
- 复杂度分析
时间复杂度:O(n)。每个元素最多被访问一次,共有 nn 个元素。
空间复杂度:O(1)。只是用了两个指针。