10 Common DSA Patterns - Java Templates
1. DFS (Depth-First Search) - Grid/Graph Traversal
void dfs(char[][] grid, int r, int c) {
if (r < 0 || c < 0 || r >= [Link] || c >= grid[0].length || grid[r][c] == '0')
return;
grid[r][c] = '0'; // mark visited
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
2. BFS (Breadth-First Search) - Level-Order / Shortest Path
public void bfs(int[][] grid, int r, int c) {
Queue<int[]> queue = new LinkedList<>();
[Link](new int[]{r, c});
while (![Link]()) {
int[] curr = [Link]();
for (int[] dir : directions) {
int nr = curr[0] + dir[0];
int nc = curr[1] + dir[1];
if (isValid(nr, nc, grid)) {
[Link](new int[]{nr, nc});
grid[nr][nc] = 0; // mark visited
}
}
}
}
3. Two Pointers
int left = 0, right = [Link] - 1;
while (left < right) {
int sum = array[left] + array[right];
if (sum == target) return true;
else if (sum < target) left++;
else right--;
}
4. Fast & Slow Pointers
ListNode slow = head, fast = head;
while (fast != null && [Link] != null) {
slow = [Link];
fast = [Link];
if (slow == fast) return true; // cycle detected
}
return false;
5. Sliding Window
int left = 0, maxLen = 0;
Map<Character, Integer> map = new HashMap<>();
for (int right = 0; right < [Link](); right++) {
char ch = [Link](right);
if ([Link](ch) && [Link](ch) >= left) {
left = [Link](ch) + 1;
}
[Link](ch, right);
maxLen = [Link](maxLen, right - left + 1);
}
6. Binary Search
int left = 0, right = [Link] - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
7. Backtracking
void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] nums, int start) {
[Link](new ArrayList<>(tempList));
for (int i = start; i < [Link]; i++) {
[Link](nums[i]);
backtrack(result, tempList, nums, i + 1);
[Link]([Link]() - 1);
}
}
8. Prefix Sum + HashMap
Map<Integer, Integer> map = new HashMap<>();
[Link](0, 1);
int sum = 0, count = 0;
for (int num : nums) {
sum += num;
if ([Link](sum - k)) count += [Link](sum - k);
[Link](sum, [Link](sum, 0) + 1);
}
9. Union Find (Disjoint Set Union)
int[] parent = new int[n];
for (int i = 0; i < n; i++) parent[i] = i;
int find(int x) {
if (parent[x] != x) parent[x] = find(parent[x]);
return parent[x];
}
void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) parent[rootX] = rootY;
}
10. Topological Sort (Kahn's Algorithm - BFS)
Queue<Integer> queue = new LinkedList<>();
int[] indegree = new int[n];
for (int[] edge : prerequisites) {
indegree[edge[0]]++;
}
for (int i = 0; i < n; i++) {
if (indegree[i] == 0) [Link](i);
}
while (![Link]()) {
int node = [Link]();
for (int neighbor : [Link](node)) {
indegree[neighbor]--;
if (indegree[neighbor] == 0) [Link](neighbor);
}
}