# 167. Two Sum II - Input Array Is Sorted
題目:<https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/>
解法一:使用 two pointers 方法,由於 input array 已經排序好,left pointer 取第一個,即最小值,right pointer 取最後一個,即最大值,若相加後大於目標值,則 right pointer 往左移,取得小一點的值,反之,若相加後小於目標值,left pointer 往右移,取得大一點的值,反覆此步驟直到相加等於目標值為止。
Python3:
``` python 3
class Solution:
def twoSum(self, numbers: list[int], target: int) -> list[int]:
idx1 = 0
idx2 = len(numbers) - 1
while idx1 < idx2:
num = numbers[idx1] + numbers[idx2]
if num == target:
break
elif num > target:
idx2 -= 1
else:
idx1 += 1
return [idx1 + 1, idx2 + 1]
if __name__ == '__main__':
numbers = [2, 7, 11, 15]
target = 9
ans = Solution().twoSum(numbers, target)
print(ans)
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
int idx1 = 0, idx2 = numbersSize - 1;
while (idx1 < idx2) {
int num = numbers[idx1] + numbers[idx2];
if (num == target)
break;
else if (num > target)
idx2--;
else
idx1++;
}
*returnSize = 2;
int* output = (int*)malloc(sizeof(int) * 2);
output[0] = idx1 + 1;
output[1] = idx2 + 1;
return output;
}
int main() {
int numbers[] = {2, 7, 11, 15};
int numbersSize = sizeof(numbers) / sizeof(numbers[0]);
int target = 9;
int returnSize;
int* ans = twoSum(numbers, numbersSize, target, &returnSize);
for (int i = 0; i < returnSize; i++)
printf("%d\n", ans[i]);
return 0;
}
```
解法二:二元搜尋法,從頭開始搜尋,假設第一個元素位置在 idx1,接著從 idx1 之後的陣列中搜尋是否有值為 target - numbers[idx1] 的元素,若有的話就輸出結果,沒有的話將 idx1+1 再次搜尋。
Python3:
``` python 3
class Solution:
def twoSum(self, numbers: list[int], target: int) -> list[int]:
def binarySearch(arr, target):
left = 0
right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] > target:
right = mid - 1
elif arr[mid] < target:
left = mid + 1
else:
return mid
return ~left
idx1 = 0
idx2 = binarySearch(numbers[idx1+1:], target - numbers[idx1])
while idx2 < 0:
idx1 += 1
idx2 = binarySearch(numbers[idx1+1:], target - numbers[idx1])
return [idx1 + 1, idx1 + idx2 + 2]
if __name__ == '__main__':
numbers = [1, 2, 3, 4, 4, 9, 56, 90]
target = 8
ans = Solution().twoSum(numbers, target)
print(ans)
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
int binarySearch(int* arr, int arrSize, int target) {
int left = 0, right = arrSize - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] > target)
right = mid - 1;
else if (arr[mid] < target)
left = mid + 1;
else
return mid;
}
return ~left;
}
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
int idx1 = 0;
int idx2 = binarySearch(numbers + idx1 + 1, numbersSize - idx1 - 1, target - numbers[idx1]);
while (idx2 < 0) {
idx1++;
idx2 = binarySearch(numbers + idx1 + 1, numbersSize - idx1 - 1, target - numbers[idx1]);
}
*returnSize = 2;
int* output = (int*)malloc(sizeof(int) * 2);
output[0] = idx1 + 1;
output[1] = idx1 + idx2 + 2;
return output;
}
int main() {
int numbers[] = {1, 2, 3, 4, 4, 9, 56, 90};
int numbersSize = sizeof(numbers) / sizeof(numbers[0]);
int target = 8;
int returnSize;
int* ans = twoSum(numbers, numbersSize, target, &returnSize);
for (int i = 0; i < returnSize; i++)
printf("%d\n", ans[i]);
return 0;
}
```
###### tags: `leetcode` `array` `two pointers` `binary search`