Solution 1
双指针+贪心策略。
- 初始化:已知输入序列有序,两个指针分别在两个端点
- 判断:计算两个指针指向数字的和
- 如果相等,范围位置,注意1-indexed
- 如果更小,则向右移动左指针
- 如果更大,则向左移动右指针
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为输入数组的长度,两个指针实际完成对数组的一次遍历
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0, right = numbers.size() - 1;
while (left < right) {
auto temp = numbers[left] + numbers[right];
if (temp == target) {
return {left + 1, right + 1};
} else if (temp < target) {
left ++;
} else {
right --;
}
}
return {0, 0};
}
};
Solution 2
Solution 1的Python实现
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
left, right = 0, len(numbers) - 1
while left < right:
temp = numbers[left] + numbers[right]
if temp == target:
return [left + 1, right + 1]
elif temp < target:
left += 1
else:
right -= 1
return [-1, -1]