当前位置: 面试刷题>> 两数之和 II - 输入有序数组(经典算法150题)
### 题目描述
**两数之和 II - 输入有序数组**
给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于一个特定目标数。
函数应该返回这两个数的索引值,其中索引1必须小于索引2。
**注意**:
- 你可以假设每种输入只会对应一个答案。
- 你可以不可以重复使用相同的元素。
**示例**:
```
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1, 2]
解释: 2 与 7 相加得到 9。因此 index1 = 1, index2 = 2。
```
### PHP 示例代码
```php
function twoSum($numbers, $target) {
$left = 0;
$right = count($numbers) - 1;
while ($left < $right) {
$sum = $numbers[$left] + $numbers[$right];
if ($sum == $target) {
return [$left + 1, $right + 1]; // 题目要求索引从1开始
} elseif ($sum < $target) {
$left++;
} else {
$right--;
}
}
// 如果没有找到符合条件的两个数,则返回空数组(题目未明确说明,但根据常规理解)
return [];
}
// 示例用法
$numbers = [2, 7, 11, 15];
$target = 9;
$result = twoSum($numbers, $target);
print_r($result);
```
### Python 示例代码
```python
def twoSum(numbers, target):
left, right = 0, len(numbers) - 1
while left < right:
current_sum = numbers[left] + numbers[right]
if current_sum == target:
return [left + 1, right + 1] # 题目要求索引从1开始
elif current_sum < target:
left += 1
else:
right -= 1
# 如果没有找到符合条件的两个数,则返回空列表(题目未明确说明,但根据常规理解)
return []
# 示例用法
numbers = [2, 7, 11, 15]
target = 9
result = twoSum(numbers, target)
print(result)
```
### JavaScript 示例代码
```javascript
function twoSum(numbers, target) {
let left = 0;
let right = numbers.length - 1;
while (left < right) {
const sum = numbers[left] + numbers[right];
if (sum === target) {
return [left + 1, right + 1]; // 题目要求索引从1开始
} else if (sum < target) {
left++;
} else {
right--;
}
}
// 如果没有找到符合条件的两个数,则返回空数组(题目未明确说明,但根据常规理解)
return [];
}
// 示例用法
const numbers = [2, 7, 11, 15];
const target = 9;
const result = twoSum(numbers, target);
console.log(result);
```
在以上示例中,我们使用了双指针的方法来解决这个问题,因为数组已经是有序的,所以我们可以从数组的两端开始向中间遍历,根据当前两数之和与目标值的比较结果来移动指针,从而找到满足条件的两个数。这种方法的时间复杂度为O(n),其中n是数组的长度。