Two pointers
Quote
“Algorithmic complexity for structured programmers: All algorithms are \(\boldsymbol{O(f(n))}\), where \(\boldsymbol{f}\) is someone else's responsibility.” — Peter Cooper
Make use of two pointers to solve problems that require traversing a sequence of elements.
Common problems:
Sliding window¶
Restrict the range of the two pointers to a certain window size or condition.
Common problems:
- Longest Substring Without Repeating Characters
- Minimum Window Substring
- Sliding Window Maximum
int lengthOfLongestSubstring(String s) {
HashSet<Character> characters = []
var start = 0
var end = 0
var maxLength = Integer.MIN_VALUE
while (end < s.length()) {
if (characters.add(s.charAt(end))) {
maxLength = Math.max(maxLength, characters.size())
end++
continue
}
characters.remove(s.charAt(start))
start++
}
return maxLength
}
int lengthOfLongestSubstring(String s) {
Set<Character> characters = new HashSet<>();
int start = 0;
int end = 0;
int maxLength = Integer.MIN_VALUE;
while (end < s.length()) {
if (characters.add(s.charAt(end))) {
maxLength = Math.max(maxLength, characters.size());
end++;
continue;
}
characters.remove(s.charAt(start));
start++;
}
return maxLength;
}
function lengthOfLongestSubstring(s) {
const characters = new Set();
let start = 0;
let end = 0;
let maxLength = Number.MIN_SAFE_INTEGER;
while (end < s.length) {
if (!characters.has(s[end])) {
characters.add(s[end]);
end++;
maxLength = Math.max(maxLength, characters.size);
continue;
}
characters.delete(s[start]);
start++;
}
return maxLength;
}
fun lengthOfLongestSubstring(s: String): Int {
val characters = hashSetOf<Char>()
var start = 0
var end = 0
var maxLength = Int.MIN_VALUE
while (end < s.length) {
if (characters.add(s[end])) {
maxLength = max(maxLength, characters.size)
end++
continue
}
characters -= s[start]
start++
}
return maxLength
}
function lengthOfLongestSubstring(s: string): number {
const characters = new Set<string>();
let start = 0;
let end = 0;
let maxLength = Number.MIN_SAFE_INTEGER;
while (end < s.length) {
if (!characters.has(s[end])) {
characters.add(s[end]);
end++;
maxLength = Math.max(maxLength, characters.size);
continue;
}
characters.delete(s[start]);
start++;
}
return maxLength;
}
Fast-slow pointers¶
Pointers that move at different speeds to find a cycle or a specific condition.
Common problems:
Problem characteristics¶
- The data structure is linear
- The task is to find more than one element