---
description: 用 Two pointer 方向想會比單純用 Array Method 效能好很多
---

# #167 Two Sum II - Input array is sorted (有圖)

[LeetCode](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/)

```
Given an array of integers that is already sorted in ascending order, 
find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, 
where index1 must be less than index2.

Note:

Your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution and you may not use the same element twice.

inpput: 給一數字陣列跟 target 數字
output: 找出哪兩個 index 的值相加等於 target, index1 一定比 index 2 前面
```

```
Example:

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.

 /**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(num, target) {}
```

### 怎麼解

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LqtRIy64UwWRHZYoDMr%2F-LqtWdpryMuFcVVKUwuu%2Ftwo1.jpg?alt=media\&token=d76748d1-1695-4345-a0d9-098ea3cbfbce)

Two pointer 直接翻譯就是兩個指針(~~廢話~~)，以這題來說就是 pointer 跟 ind，我們來想一下題目，題目說已經按照大小排好了

* num\[pointer] + num\[ind] < targer，兩個總和若太小則 pointer ++，讓他總和變大

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LqtRIy64UwWRHZYoDMr%2F-LqtWm6RAJ3E_5T-oUND%2Ftwo2.jpg?alt=media\&token=f9a81632-ae1e-4db0-a9c1-4b629c4f076c)

* num\[pointer] + num\[ind] > targer，兩個總和若太大 ind -- ，讓他總和變小

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LqtRIy64UwWRHZYoDMr%2F-LqtWviTChgzPEfgblsB%2Ftwo3.jpg?alt=media\&token=f724778a-7fba-4b3b-a579-6f5beec70c2d)

<pre class="language-javascript"><code class="lang-javascript">var twoSum = function(numbers, target) {
    let pointer = 0;
    let len = numbers.length
    let ind = len - 1
 
    while( target !== numbers[ind] + numbers[pointer]){
        target > numbers[ind] + numbers[pointer] ? pointer ++ : ind --;
    }
       
    return [pointer+1, ind+1];
    
<strong>    let L = 0
</strong>    let R = numbers.length - 1
    while(L&#x3C;R){
        if(numbers[L] + numbers[R] === target){
          return [L+1, R+1]    
        }
        
        if(target-numbers[L] &#x3C; numbers[R]){
            R--
        } else {
            L++
        }
    }
    
    return [-1, -1]
};
</code></pre>
