Two pointers
Two pointers: one input, opposite ends
JavaScript
let fn = arr => {
let left = 0, ans = 0, right = arr.length - 1;
while (left < right) {
// do some logic here with left and right
if (/* CONDITION */) {
left++;
} else {
right--;
}
}
return ans;
}
TypeScript
let fn = (arr: any[]): number => {
let left: number = 0, ans: number = 0, right: number = arr.length - 1;
while (left < right) {
// do some logic here with left and right
if (/* CONDITION */) {
left++;
} else {
right--;
}
}
return ans;
}
Two pointers: two inputs, exhaust both
JavaScript
let fn = (arr1, arr2) => {
let i = 0, j = 0, ans = 0;
while (i < arr1.length && j < arr2.length) {
// do some logic here
if (/* CONDITION */) {
i++;
} else {
j++;
}
}
while (i < arr1.length) {
// do logic
i++;
}
while (j < arr2.length) {
// do logic
j++;
}
return ans;
}
TypeScript
let fn = (arr1: any[], arr2: any[]): number => {
let i: number = 0, j: number = 0, ans: number = 0;
while (i < arr1.length && j < arr2.length) {
// do some logic here
if (/* CONDITION */) {
i++;
} else {
j++;
}
}
while (i < arr1.length) {
// do logic
i++;
}
while (j < arr2.length) {
// do logic
j++;
}
return ans;
}
Examples
Second pointer start when string ends
var reverseWords = function (s) {
const reversedWords = [];
let index = s.indexOf(" ");
let first = index - 1;
let second = 0;
while (second < s.length) {
if (first === -2) {
first = s.length - 1;
}
if (second !== index) {
reversedWords[second] = s[first];
first--;
} else {
reversedWords[second] = " ";
index = s.indexOf(" ", index + 1);
first = index - 1;
}
second++;
}
return reversedWords.join("");
};
Get common val in two arrays
var getCommon = function (nums1, nums2) {
let first = 0;
let second = 0;
while (first < nums1.length && second < nums2.length) {
if (nums1[first] === nums2[second]) {
return nums1[first];
}
if (nums1[first] > nums2[second]) {
second++;
} else if (nums2[second] > nums1[first]) {
first++;
}
}
return -1;
};