Place two pointers at different positions and move them based on conditions. Typically one at each end walking inward, or both from the left at different speeds.
def two_sum(arr, target): # arr must be sorted
left, right = 0, len(arr) - 1
while left < right:
s = arr[left] + arr[right]
if s == target:
return [left, right]
elif s < target:
left += 1 # need larger sum
else:
right -= 1 # need smaller sum
return []
vector<int> twoSum(vector<int>& arr, int target) { // arr must be sorted
int l = 0, r = arr.size() - 1;
while (l < r) {
int s = arr[l] + arr[r];
if (s == target) return {l, r};
else if (s < target) l++; // need larger sum
else r--; // need smaller sum
}
return {};
}
int[] TwoSum(int[] arr, int target) { // arr must be sorted
int l = 0, r = arr.Length - 1;
while (l < r) {
int s = arr[l] + arr[r];
if (s == target) return new[] {l, r};
else if (s < target) l++; // need larger sum
else r--; // need smaller sum
}
return new int[0];
}
int[] twoSum(int[] arr, int target) { // arr must be sorted
int l = 0, r = arr.length - 1;
while (l < r) {
int s = arr[l] + arr[r];
if (s == target) return new int[]{l, r};
else if (s < target) l++; // need larger sum
else r--; // need smaller sum
}
return new int[0];
}