package com.freetymekiyan.algorithms.level.medium;
/**
* 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.
* <p>
* 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. Please note that your returned answers (both index1 and index2) are not zero-based.
* <p>
* You may assume that each input would have exactly one solution.
* <p>
* Input: numbers={2, 7, 11, 15}, target=9
* Output: index1=1, index2=2
* <p>
* Tags: Array, Two Pointers, Binary Search
* Similar: Problems (E) Two Sum
*/
public class TwoSum2 {
/**
* Two pointers.
* Use two indices from both ends of the array and compare sum with target.
* If target is larger, move the end index.
* If target is smaller, move the start index.
* Stop till we find the target.
*/
public int[] twoSum(int[] numbers, int target) {
int start = 0;
int end = numbers.length - 1;
while (start < end) {
long sum = numbers[start] + numbers[end];
if (sum > target) {
end--;
} else if (sum < target) {
start++;
} else {
break;
}
}
return new int[]{start + 1, end + 1};
}
}