Coding Interview Patterns: Part 1

TheMridulSahu
6 min readJan 8, 2023

--

Image by upklyak on Freepik

Introduction

Coding interview patterns are techniques that are commonly used in coding interviews to solve problems more efficiently and effectively. In this article, we will cover the first 10 of 20 coding interview patterns:

  1. Frequency Counter Pattern
  2. Multiple Pointers Pattern
  3. Sliding Window Pattern
  4. Dynamic Programming Pattern
  5. Merge Intervals Pattern
  6. Two Pointers Pattern
  7. Depth-First Search (DFS) Pattern
  8. Breadth-First Search (BFS) Pattern
  9. Backtracking Pattern
  10. Bit Manipulation Pattern

1. Frequency Counter Pattern

The frequency counter pattern involves using a data structure (such as a hash map or dictionary) to count the frequency of elements in a dataset. This pattern can be useful for solving problems that involve comparing the frequency of elements in two lists or finding elements that appear a certain number of times in a list.

Example: Finding the first element in an array that appears more than once

def first_duplicate(arr):
frequency_counter = {}
for num in arr:
if num in frequency_counter:
return num
else:
frequency_counter[num] = 1
return None

Time complexity: O(n)

2. Multiple Pointers Pattern

The multiple pointers pattern involves using two or more pointers to traverse a list or array in search of a specific element or to determine if there is a pair of elements that meets a certain condition. This pattern can be used to solve problems that involve finding pairs of elements that sum to a target value, checking for palindromes, or finding the intersection of two sorted lists.

Example: Finding the first pair of elements in an array that sum to a specific target value

def find_pair(arr, target_sum):
left = 0
right = len(arr) - 1
while left < right:
current_sum = arr[left] + arr[right]
if current_sum == target_sum:
return (arr[left], arr[right])
elif current_sum < target_sum:
left += 1
else:
right -= 1
return None

Time complexity: O(n)

3. Sliding Window Pattern

The sliding window pattern involves using a sliding window to iterate over a list or string and perform some operation on each window. This pattern can be useful for solving problems that involve finding the maximum or minimum sum of a contiguous subarray or counting the number of substrings that meet a certain condition.

Example: Finding the longest substring in a string that contains no more than two distinct characters

def longest_substring(s):
left = 0
right = 0
max_length = 0
distinct_characters = {}
while right < len(s):
# Add the current character to the window
c = s[right]
if c not in distinct_characters:
distinct_characters[c] = 0
distinct_characters[c] += 1
# Check if the window size is greater than 2
while len(distinct_characters) > 2:
# Remove the leftmost character from the window
d = s[left]
distinct_characters[d] -= 1
if distinct_characters[d] == 0:
del distinct_characters[d]
left += 1
# Update the maximum length
max_length = max(max_length, right - left + 1)
right += 1
return max_length

Time complexity: O(n)

4. Dynamic Programming Pattern

Dynamic programming is a technique for solving problems by breaking them down into smaller subproblems and storing the solutions to these subproblems in a table or array. This pattern can be used to solve problems that have an optimal substructure, meaning that the optimal solution to the problem can be constructed from optimal solutions to its subproblems.

Example: Finding the nth Fibonacci number

def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
table = [0] * (n+1)
table[0] = 0
table[1] = 1
for i in range(2, n+1):
table[i] = table[i-1] + table[i-2]
return table[n]

Time complexity: O(n)

5. Merge Intervals Pattern

The merge intervals pattern involves merging overlapping intervals in a list. This pattern can be used to solve problems that involve scheduling tasks or finding the minimum number of time intervals needed to cover a set of events.

Example: Merging a list of intervals

def merge_intervals(intervals):
intervals.sort(key=lambda x: x[0])
merged = []
for interval in intervals:
if not merged or merged[-1][1] < interval[0]:
merged.append(interval)
else:
merged[-1][1] = max(merged[-1][1], interval[1])
return merged

Time complexity: O(n * log(n))

6. Two Pointers Pattern

The two pointers pattern involves using two pointers to traverse a list or array and find a pair of elements that meet a certain condition. This pattern can be used to solve problems that involve finding pairs of elements that sum to a target value, checking for palindromes, or finding the intersection of two sorted lists.

Example: Finding the first pair of elements in an array that sum to a specific target value

def find_pair(arr, target_sum):
left = 0
right = len(arr) - 1
while left < right:
current_sum = arr[left] + arr[right]
if current_sum == target_sum:
return (arr[left], arr[right])
elif current_sum < target_sum:
left += 1
else:
right -= 1
return None

Time complexity: O(n)

7. Depth-First Search (DFS) Pattern

The depth-first search (DFS) pattern involves traversing a tree or graph by exploring as far as possible along each branch before backtracking. This pattern can be used to solve problems that involve searching for a specific element in a tree or graph or checking if there is a path between two nodes.

Example: Checking if a tree is a binary search tree (BST)

def is_bst(root):
stack = [(root, float('-inf'), float('inf'))]
while stack:
node, lower_bound, upper_bound = stack.pop()
if not node:
continue
if node.val <= lower_bound or node.val >= upper_bound:
return False
stack.append((node.left, lower_bound, node.val))
stack.append((node.right, node.val, upper_bound))
return True

Time complexity: O(n)

8. Breadth-First Search (BFS) Pattern

The breadth-first search (BFS) pattern involves traversing a tree or graph by exploring all the nodes at the current level before moving on to the next level. This pattern can be used to solve problems that involve finding the shortest path between two nodes or computing the connected components of a graph.

Example: Computing the shortest path between two nodes in a graph

def shortest_path(graph, start, end):
queue = [(start, [start])]
while queue:
node, path = queue.pop(0)
if node == end:
return path
for neighbor in graph[node]:
if neighbor not in path:
queue.append((neighbor, path + [neighbor]))
return None

Time complexity: O(n + m), where n is the number of nodes and m is the number of edges

9. Backtracking Pattern

The backtracking pattern involves exploring all possible paths or configurations by recursively trying one possibility at a time and backtracking if it leads to a dead end. This pattern can be used to solve problems that involve finding all possible solutions to a problem or generating permutations or combinations.

Example: Generating all permutations of a list

def permute(arr):
def backtrack(first=0):
if first == len(arr):
output.append(arr.copy())
for i in range(first, len(arr)):
arr[first], arr[i] = arr[i], arr[first]
backtrack(first + 1)
arr[first], arr[i] = arr[i], arr[first]
output = []
backtrack()
return output

Time complexity: O(n * n!), where n is the length of the list

10. Bit Manipulation Pattern

The bit manipulation pattern involves using bitwise operators to manipulate individual bits in a number. This pattern can be used to solve problems that involve checking if a number is even or odd, setting or clearing a bit, or finding the number of set bits in a number.

Example: Checking if a number is a power of 2

def is_power_of_two(n):
return n > 0 and (n & (n - 1)) == 0

Time complexity: O(1)

In conclusion, the frequency counter, multiple pointers, sliding window, dynamic programming, merge intervals, two pointers, depth-first search, breadth-first search, backtracking, and bit manipulation patterns are all useful techniques for solving coding interview problems. By understanding these patterns and how to apply them, you can increase your chances of success in a coding interview.

Stay tuned for the second part of this article, where we will cover the remaining 10 coding interview patterns. Follow us to make sure you don’t miss out on any updates!

--

--

TheMridulSahu
TheMridulSahu

Written by TheMridulSahu

Aspiring Writer, Sharing Knowledge And Gaining Perspective, Software Engineer @ Google

No responses yet