问题描述
给你一个下标从 1 开始的整数数组 numbers
,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。如果设这两个数分别是 numbers[index1]
和 numbers[index2]
,则 1 <= index1 < index2 <= numbers.length
。
以长度为 2 的整数数组 [index1, index2]
的形式返回这两个整数的下标 index1
和 index2
。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
问题分析
这道题是一个典型的用双指针求解的问题。一个指针初始指向最小元素,即数组最左边,向右遍历;另一个指针初始指向最大元素,即数组最右边,向左遍历。
如果两个指针指向的元素值之和等于目标值,则返回指针所指元素下标;若元素之和小于给定值,则将左边的指针右移一位;若元素之和大于给定值,则将右边的指针左移一位。
复杂度分析
最坏情况下,只需要遍历一遍数组,时间复杂度是 O ( n ) O(n) O(n)
程序代码
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int i = 0, j = numbers.size() - 1;
while( i < j ) {
if(numbers[i] + numbers[j] < target) {
i++;
}
else if(numbers[i] + numbers[j] > target) {
j--;
}
else {
break;
}
}
return vector<int>{i + 1, j + 1};
}
};