刷题网站:Leetcode
难度: 简单
语言: Python
计划:从简单——>到中等——>再到难。
一、167两数之和II-输入有序数组
1.1 题目:
给定一个已按照 非递减顺序排列的整数数组 numbers
,请你从数组中找出两个数满足相加之和等于目标数 target
。
函数应该以长度为 2
的整数数组的形式返回这两个数的下标值。numbers
的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length
。
你可以假设每个输入 **只对应唯一的答案 **,而且你 不可以 重复使用相同的元素。
- 示例1
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
- 示例2
输入:numbers = [2,3,4], target = 6
输出:[1,3]
- 示例3
输入:numbers = [-1,0], target = -1
输出:[1,2]
1.2 思考分析
首先我们理解题意,输入一个非递减顺序排列的数组,这时候我们第一反应应该想到的是用双指针思想。(虽然我第一反应没有想到,还是看了评论才回想起)。
然后我们分析一下,从左指针往右,右指针往左开始累加计算是否等于目标值。
例如,当输入数组[2,7,11,15]
,目标值为9
时,我们先考虑2
加15
判断是否等于目标值,如果大于目标值,则说明右指针要往左边移一个单位,类似的若小于目标值则左指针往右移动一个单位。
故完整的代码如下:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
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 = left +1
else:
right = right -1
最后执行结果
1.3 总结
做这种题一定要考虑用双指针方法,不然用我自己想的虽然答案能出来,但是放入leetcode编译器中就会显示超出时间限制
,出问题。