声明:
今天是第36道题。给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数,函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数,函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
示例:
输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2
说明:
- 返回的下标值(index1 和 index2)不是从零开始的
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素
解法1。用的是对撞指针的思想,左右2个指针不断向中间靠拢,因为target可以拆分为一个较大值和一个较小值之和,如果当前左右指针对应元素和小了,则左指针右移,反之右指针左移,相等则返回,时间/空间复杂度都控制得很好,代码如下。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
# if numbers[0] >= target:
# return None 这两句代码不能加,加了提交会报错,但我不明白这个校验没啥问题啊
# V 1.0,能提交
left = 0
right = len(numbers)-1
while left < right:
if numbers[left]+numbers[right] == target:
return [left+1, right+1]
elif numbers[left]+numbers[right] < target:
left += 1
else:
right -= 1
return []
解法2。用字典存放numbers的元素值(键)和对应索引值(键值),对每个元素判断它的另一半在不在字典里,在即返回,不在继续往后遍历把元素放到字典里,代码如下。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
# V 2.0,能提交
store = {} # 设置1个字典用于存放numbers数组中的元素和对应索引值
index = 0 # 索引的指针
while index < len(numbers):
if numbers[index] not in store: # 先把所有元素和对应索引值放到这个字典里
store[numbers[index]] = index+1
if target-numbers[index] in store: # 找到另一个较小值
if d[target-numbers[index]] < index+1: # 这步判断是必须的,因为index1<index2,
return [d[target-numbers[index]], index+1] # 且当前元素肯定是较大的那只(因为数组已经遍历到后面了,所以target-numbers[index]是更小的那个元素)
index += 1
结尾
解法1:https://blog.csdn.net/qq_17550379/article/details/80512745
解法2:https://blog.csdn.net/fenglei0415/article/details/80810987