---
# System prepended metadata

title: 167. Two Sum II - Input Array Is Sorted
tags: [pointer, Leetcode, binary search, medium, python, c++]

---

###### tags: `Leetcode` `medium` `pointer` `binary search` `python` `c++`

# 167. Two Sum II - Input Array Is Sorted

## [題目連結:] https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/

## 題目:
Given a **1-indexed** array of integers numbers that is already **sorted in non-decreasing order**, find two numbers such that they add up to a specific ```target``` number. Let these two numbers be ```numbers[index1]``` and ```numbers[index2]``` where ```1 <= index1 < index2 <= numbers.length```.

Return the indices of the two numbers, ```index1``` and ```index2```, **added by one** as an integer array ```[index1, index2]``` of length 2.

The tests are generated such that there is **exactly one solution**. You **may not** use the same element twice.

* Your solution must use only constant extra space.

**Example 1:**
```
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].
```
**Example 2:**
```
Input: numbers = [2,3,4], target = 6
Output: [1,3]
Explanation: The sum of 2 and 4 is 6. Therefore index1 = 1, index2 = 3. We return [1, 3].
```
**Example 3:**
```
Input: numbers = [-1,0], target = -1
Output: [1,2]
Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].
```

## 解題想法:
* 求數組中兩數和等於target:
    * 一定有解
    * index起始訂為1
    * 限制要常數space
* 使用pointer
    * 頭尾移動判斷和即可

## Python:
``` python=
class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        #因為已經排好了 用兩個pointer
        head=0
        tail=len(numbers)-1
        while head<tail:
            if numbers[head]+numbers[tail]==target:
                return [head+1,tail+1]
            elif numbers[head]+numbers[tail]>target:
                tail-=1
            else:
                head+=1

result = Solution()
numbers = [2,7,11,15]
target = 9
ans = result.twoSum(numbers,target)
print(ans)
```

## C++:
``` cpp=
#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left=0, right=numbers.size()-1;
        vector<int> res;
        while (left<right){
            if (numbers[left]+numbers[right]==target){
                res.push_back(left+1);
                res.push_back(right+1);
                return res;
            }
            else if (numbers[left]+numbers[right]>target)
                right-=1;
            else
                left+=1;
        }
        return res;
    }
};

int main(){
    Solution res;
    vector<int> numbers={2,7,11,15};
    vector<int> ans=res.twoSum(numbers,9);
    for (auto pos: ans){
        cout<<pos<<endl;
    }
    return 0;
}


```