给定一个已经排好顺序的整数数组 nums
和一个整数目标值 target
,请你在该数组中找出和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
输入:nums = [2,7,11,15]
, target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9
,返回 [0, 1]
。
输入:nums = [3,2,4]
, target = 6
输出:[1,2]
输入:nums = [3,3]
, target = 6
输出:[0,1]
2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
- 只会存在一个有效答案
- 暴力做法:采用两层循环的方式,依次遍历数组,直至找到相加等于
target
的2个数
def Solution1(nums, target):
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
- 双指针做法:利用数组已经排好序的性质。
def Solution2(nums, target):
left = 0
right = len(nums) - 1
while left < right:
if nums[left] + nums[right] == target:
return [left,right]
if nums[left] + nums[right] < target:
left += 1
else:
right -= 1
return None
- 两个指针分别指向数组首尾,相加。结果有两种情况,如果相加
> target
,则说明right
指针指向的数太大,需要左移;如果< target
,则说明left
指针指向的数太小,需要右移。如果相等,则返回结果。 - 时间复杂度
O(n)
,空间复杂度O(1)
。