###### 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; } ```