AAPS Shubh
AAPS Shubh
🔹 Concept Recap:
A prefix sum array stores cumulative sums so you can answer range sum queries in O(1)
time after preprocessing.
🔹 Algorithm:
🔹 Java Code:
java
CopyEdit
public class PrefixSumRange {
public static int[] buildPrefixSum(int[] arr) {
int[] prefix = new int[arr.length];
prefix[0] = arr[0];
for (int i = 1; i < arr.length; i++) {
prefix[i] = prefix[i - 1] + arr[i];
}
return prefix;
}
🔹 Algorithm:
🔹 Java Code:
java
CopyEdit
public class EquilibriumIndex {
public static int findEquilibrium(int[] arr) {
int total = 0;
for (int num : arr) total += num;
int leftSum = 0;
for (int i = 0; i < arr.length; i++) {
total -= arr[i]; // right sum
if (leftSum == total) return i;
leftSum += arr[i];
}
return -1;
}
🔹 Algorithm:
Similar to equilibrium index, but only check if any index splits array into equal halves.
🔹 Java Code:
java
CopyEdit
public class PrefixEqualsSuffix {
public static boolean canBeSplit(int[] arr) {
int total = 0;
for (int num : arr) total += num;
int leftSum = 0;
for (int i = 0; i < arr.length; i++) {
total -= arr[i]; // right sum
if (leftSum == total) return true;
leftSum += arr[i];
}
return false;
}
🔹 Algorithm:
Use sliding window of size k, update sum by adding next element and removing the first of
the window.
🔹 Java Code:
java
CopyEdit
public class MaxSubarraySumK {
public static int maxSumK(int[] arr, int k) {
if (arr.length < k) return -1;
int windowSum = 0;
for (int i = 0; i < k; i++) windowSum += arr[i];
🔹 Java Code:
java
CopyEdit
import java.util.HashSet;
🔹 Time: O(n)
🔹 Concept:
🔹 How It Works:
1. For each index, expand left and right to check for palindrome.
2. Track longest one.
🔹 Java Code:
java
CopyEdit
public class LongestPalindrome {
public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
🔹 Time: O(n^2)
🔹 Space: O(1)
🔹 Algorithm:
🔹 Java Code:
java
CopyEdit
public class LongestCommonPrefix {
public static String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (!strs[i].startsWith(prefix)) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
}
return prefix;
}
🔹 Time: O(n * m)
🔹 Space: O(1)
🔹 Algorithm (Backtracking):
🔹 Java Code:
java
CopyEdit
public class StringPermutations {
public static void permute(char[] arr, int l, int r) {
if (l == r) {
System.out.println(String.valueOf(arr));
} else {
for (int i = l; i <= r; i++) {
swap(arr, l, i);
permute(arr, l + 1, r);
swap(arr, l, i); // backtrack
}
}
}
🔹 Space: O(n)
🔹 Java Code:
java
CopyEdit
public class TwoSumSorted {
public static int[] twoSum(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) return new int[]{left, right};
if (sum < target) left++;
else right--;
}
return new int[]{-1, -1};
}
🔹 Time: O(n)
🔹 Space: O(1)
12. Next Lexicographical Permutation
🔹 Algorithm:
1. Find the pivot where arr[i] < arr[i+1] from the end.
2. Swap with next greater element on the right.
3. Reverse suffix.
🔹 Java Code:
java
CopyEdit
import java.util.Arrays;
if (i >= 0) {
int j = nums.length - 1;
while (nums[j] <= nums[i]) j--;
swap(nums, i, j);
}
🔹 Time: O(n)
🔹 Space: O(1)
🔹 Java Code:
java
CopyEdit
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
🔹 Time: O(n + m)
🔹 Space: O(1)
🔹 Java Code:
java
CopyEdit
public class MedianSortedArrays {
public static double findMedianSortedArrays(int[] A, int[] B) {
if (A.length > B.length) return findMedianSortedArrays(B, A);
int m = A.length, n = B.length;
🔹 Time: O(log(min(m,n)))
🔹 Space: O(1)
java
CopyEdit
public class KthSmallestSortedMatrix {
public static int kthSmallest(int[][] matrix, int k) {
int n = matrix.length;
int low = matrix[0][0], high = matrix[n - 1][n - 1];
return low;
}
🔹 Space: O(1)
🔹 Java Code:
java
CopyEdit
public class MajorityElement {
public static int findMajority(int[] nums) {
int count = 0, candidate = 0;
return candidate;
}
🔹 Space: O(1)
🔹 Java Code:
java
CopyEdit
public class TrappingRainWater {
public static int trap(int[] height) {
int left = 0, right = height.length - 1, res = 0;
int leftMax = 0, rightMax = 0;
🔹 Time: O(n)
🔹 Space: O(1)
• Use prefix mask and set to find max XOR at each bit level.
🔹 Java Code:
java
CopyEdit
import java.util.HashSet;
🔹 Time: O(n)
🔹 Space: O(n)
🔹 Algorithm (Dynamic):
🔹 Java Code:
java
CopyEdit
public class MaxProductSubarray {
public static int maxProduct(int[] nums) {
int max = nums[0], min = nums[0], result = nums[0];
🔹 Time: O(n)
🔹 Space: O(1)
🔹 Algorithm (Combinatorics):
🔹 Java Code:
java
CopyEdit
public class UniqueDigitNumbers {
public static int countNumbersWithUniqueDigits(int n) {
if (n == 0) return 1;
int res = 10, uniqueDigits = 9, available = 9;
return res;
}
🔹 Time: O(n)
🔹 Space: O(1)
Algorithm: Use DP. For each number i, countBits[i] = countBits[i >> 1] + (i &
1).
Java Code:
java
CopyEdit
public int[] countBits(int n) {
int[] res = new int[n + 1];
for (int i = 1; i <= n; i++) {
res[i] = res[i >> 1] + (i & 1);
}
return res;
}
Java Code:
java
CopyEdit
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
Java Code:
java
CopyEdit
class TrieNode {
TrieNode[] child = new TrieNode[2];
}
Explanation: Bit manipulation deals with bitwise operations (AND, OR, XOR, NOT, shift). It is
efficient in time and memory, widely used in low-level programming, optimization, and
competitive coding.
Advantages:
• Constant-time operations
• Efficient data compression
• Can solve tricky problems with elegance (e.g., XOR to find duplicates)
Java Code:
java
CopyEdit
public int[] nextGreaterElements(int[] nums) {
Stack<Integer> stack = new Stack<>();
int[] res = new int[nums.length];
Arrays.fill(res, -1);
for (int i = 0; i < nums.length * 2; i++) {
int num = nums[i % nums.length];
while (!stack.isEmpty() && nums[stack.peek()] < num)
res[stack.pop()] = num;
if (i < nums.length)
stack.push(i);
}
return res;
}
Java Code:
java
CopyEdit
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy, second = dummy;
for (int i = 0; i <= n; i++) first = first.next;
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}
Java Code:
java
CopyEdit
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA, b = headB;
while (a != b) {
a = a == null ? headB : a.next;
b = b == null ? headA : b.next;
}
return a;
}
Time Complexity: O(m + n)
Space Complexity: O(1)
Algorithm: Use two pointers from start and end of the array.
Java Code:
java
CopyEdit
class TwoStacks {
int[] arr;
int top1, top2;
TwoStacks(int size) {
arr = new int[size];
top1 = -1;
top2 = size;
}
void push1(int x) {
if (top1 + 1 < top2)
arr[++top1] = x;
}
void push2(int x) {
if (top1 + 1 < top2)
arr[--top2] = x;
}
int pop1() {
return top1 >= 0 ? arr[top1--] : -1;
}
int pop2() {
return top2 < arr.length ? arr[top2++] : -1;
}
}
Java Code:
java
CopyEdit
public boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int rev = 0;
while (x > rev) {
rev = rev * 10 + x % 10;
x /= 10;
}
return x == rev || x == rev / 10;
}
Explanation: A linked list is a linear data structure where elements (nodes) point to the
next. Types include singly, doubly, and circular linked lists.
Applications:
Java Code:
java
CopyEdit
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> deque = new ArrayDeque<>();
int n = nums.length;
int[] res = new int[n - k + 1];
for (int i = 0; i < n; i++) {
if (!deque.isEmpty() && deque.peek() == i - k)
deque.poll();
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i])
deque.pollLast();
deque.offer(i);
if (i >= k - 1)
res[i - k + 1] = nums[deque.peek()];
}
return res;
}
Time Complexity: O(n)
Space Complexity: O(k)
Java Code:
java
CopyEdit
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
int maxArea = 0, i = 0;
while (i < heights.length) {
if (stack.isEmpty() || heights[i] >= heights[stack.peek()])
stack.push(i++);
else {
int h = heights[stack.pop()];
int w = stack.isEmpty() ? i : i - stack.peek() - 1;
maxArea = Math.max(maxArea, h * w);
}
}
while (!stack.isEmpty()) {
int h = heights[stack.pop()];
int w = stack.isEmpty() ? i : i - stack.peek() - 1;
maxArea = Math.max(maxArea, h * w);
}
return maxArea;
}
Use Cases:
• Maximum/Minimum in window
• Longest substring without repeating characters
• Average of subarrays
Java Code:
java
CopyEdit
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int sum = 0, count = 0;
for (int num : nums) {
sum += num;
count += map.getOrDefault(sum - k, 0);
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
Java Code:
java
CopyEdit
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int n : nums)
map.put(n, map.getOrDefault(n, 0) + 1);
java
CopyEdit
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
backtrack(res, new ArrayList<>(), nums, 0);
return res;
}
Java Code:
Java Code:
Explanation:
Key Differences:
Java Code:
java
CopyEdit
public int maxFrequencyElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
int maxFreq = 0, element = nums[0];
for (int num : nums) {
int freq = map.getOrDefault(num, 0) + 1;
map.put(num, freq);
if (freq > maxFreq) {
maxFreq = freq;
element = num;
}
}
return element;
}
Algorithm:
Track the maximum current sum and update global max.
Java Code:
java
CopyEdit
public int maxSubArray(int[] nums) {
int maxSoFar = nums[0], maxEndingHere = nums[0];
for (int i = 1; i < nums.length; i++) {
maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
maxSoFar = Math.max(maxSoFar, maxEndingHere);
}
return maxSoFar;
}
Time: O(n)
Space: O(1)
Example: [-2,1,-3,4,-1,2,1,-5,4] → 6
Concept:
Use DP to store max sum ending at each index.
DP Relation:
dp[i] = max(nums[i], dp[i-1] + nums[i])
Java Code:
java
CopyEdit
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
max = Math.max(max, dp[i]);
}
return max;
}
Time: O(n)
Space: O(n)
Algorithm:
Use HashMap and PriorityQueue.
Java Code:
Algorithm:
Use HashMap to store (target - num).
Java Code:
Time: O(n)
Space: O(n)
Explanation:
Algorithm:
Expand around center.
Java Code:
public String longestPalindrome(String s) {
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandFromCenter(s, i, i);
int len2 = expandFromCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
Time: O(n²)
Space: O(1)
Concept:
Algorithm:
Java Code:
java
CopyEdit
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) i--;
if (i >= 0) {
int j = nums.length - 1;
while (nums[j] <= nums[i]) j--;
swap(nums, i, j);
}
reverse(nums, i + 1, nums.length - 1);
}
Time: O(n)
Space: O(1)
49. Intersection of Two Linked Lists
Algorithm:
Use two pointers and traverse both lists.
Java Code:
java
CopyEdit
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA, b = headB;
while (a != b) {
a = (a == null) ? headB : a.next;
b = (b == null) ? headA : b.next;
}
return a;
}
Time: O(m + n)
Space: O(1)
Definition:
An index i such that sum of elements before i equals sum after i.
Applications:
• Load balancing
• Stock span analysis
• Partition-based problems
Approach:
Use total sum and subtract prefix while iterating.