You keep two indices (e.g., left/right) and move them based on a rule, often on a sorted array or a sliding window. It can reduce nested loops to O(n) in many problems.
function hasPairSum(arr: number[], target: number) {
let l = 0;
let r = arr.length - 1;
while (l < r) {
const sum = arr[l] + arr[r];
if (sum === target) return true;
if (sum < target) l++;
else r--;
}
return false;
}