---
tags: LeetCode
---
# 167. 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**.
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.
```
---
輸入範本如下
```C#
public class Solution {
public int[] TwoSum(int[] numbers, int target)
{
}
}
```
### 直覺想法
1. two index 去找.
- 使用兩個 index 去逼近 , 若找到的值太小 , left-- , 反之 right++
```C#
248 ms 31.2 MB
You are here!
Your runtime beats 53.69 % of csharp submissions.
public int[] TwoSum(int[] numbers, int target)
{
for (int left = 0, right = numbers.Length - 1; left < right;)
{
int value = numbers[left] + numbers[right];
if (value == target)
{
return new int[] { left + 1, right + 1 };
}
else if (value < target)
{
left++;
}
else
{
right--;
}
}
throw new Exception("not found");
}
```
2. 二分搜尋法
- 使用二分搜尋逼近找解 ,
- 需要注意的是 **left + 1** 不能放入 left , 否則可能會找到 left , left 的答案.
```C#
244 ms 31.3 MB
You are here!
Your runtime beats 71.98 % of csharp submissions.
public int[] TwoSum(int[] numbers, int target)
{
for (int left = 0, right = numbers.Length - 1; left < right; left++)
{
int find = BinarySearch(numbers, left + 1, right, target - numbers[left]) ?? -1;
if (find != -1)
{
return new int[] { left + 1, find + 1 };
}
}
throw new Exception("not found");
int? BinarySearch(int[] num, int l, int r, int find)
{
while (l <= r)
{
int index = (l + r) / 2;
if (num[index] == find)
return index;
else if (num[index] < find)
l = index + 1;
else if (num[index] > find)
r = index - 1;
}
return null;
}
}
```
3. 一樣是二分搜尋
- 差別從兩個方向去逼近 , 避免解答在最右邊的位置處.
```C#
244 ms 31.1 MB
You are here!
Your runtime beats 71.98 % of csharp submissions.
public int[] TwoSum(int[] numbers, int target)
{
int left = 0;
int right = numbers.Length - 1;
//使用二元搜尋法去尋找left以及right
while (numbers[left] + numbers[right] != target)
{
if (numbers[left] + numbers[right] < target)
left = BinarySearch(numbers, left + 1, right - 1, target - numbers[right]) ?? left + 1;
else if (numbers[left] + numbers[right] > target)
right = BinarySearch(numbers, left + 1, right - 1, target - numbers[left]) ?? right - 1;
}
return new int[] { left + 1, right + 1 };
int? BinarySearch(int[] num, int l, int r, int find)
{
while (l <= r)
{
int index = (l + r) / 2;
if (num[index] == find)
return index;
else if (num[index] < find)
l = index + 1;
else if (num[index] > find)
r = index - 1;
}
return null;
}
}
```
### Thank you!
You can find me on
- [GitHub](https://github.com/s0920832252)
- [Facebook](https://www.facebook.com/fourtune.chen)
若有謬誤 , 煩請告知 , 新手發帖請多包涵
# :100: :muscle: :tada: :sheep: