0% found this document useful (0 votes)
11 views49 pages

Aaps Assignment

The document provides various Java programming solutions for common algorithmic problems, including prefix sum arrays, equilibrium indices, and longest substrings without repeating characters. Each solution is accompanied by code snippets, time complexity, and space complexity analyses. Key concepts such as sliding window techniques and median finding in sorted arrays are also discussed.

Uploaded by

kunalkumar69793
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views49 pages

Aaps Assignment

The document provides various Java programming solutions for common algorithmic problems, including prefix sum arrays, equilibrium indices, and longest substrings without repeating characters. Each solution is accompanied by code snippets, time complexity, and space complexity analyses. Key concepts such as sliding window techniques and median finding in sorted arrays are also discussed.

Uploaded by

kunalkumar69793
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 49

1.

Prefix Sum Array - Concept & Applications


🔹 Concept Recap:

A prefix sum array stores cumulative sums so you can answer range sum queries in O(1)
time after preprocessing.

2. Java Program: Range Sum using Prefix Sum Array

🔹 Java Code:

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;
}

public static int rangeSum(int[] prefix, int L, int R) {

if (L == 0) return prefix[R];
return prefix[R] - prefix[L - 1];
}

public static void main(String[] args) {


int[] arr = {1, 2, 3, 4, 5};
int[] prefix = buildPrefixSum(arr);
System.out.println("Sum from index 1 to 3: " +
rangeSum(prefix, 1, 3)); // Output: 9
}
}
🔹 🔹Time Complexity: O(n) for prefix, O(1) per query
Space Complexity: O(n)

3. Java Program: Equilibrium Index

🔹 Java Code:

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;
}
public static void main(String[] args) {
int[] arr = {-7, 1, 5, 2, -4, 3, 0};
System.out.println("Equilibrium Index: " +

findEquilibrium(arr)); // Output: 3
}
}

🔹 Time Complexity: O(n)

🔹 Space Complexity: O(1)

4. Java Program: Check if Prefix Sum Equals Suffix Sum


🔹 Java Code:

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;
}
public static void main(String[] args) {

int[] arr = {1, 2, 3, 3};


System.out.println("Can be split: " + canBeSplit(arr)); //
Output: true
}
}

🔹 Time Complexity: O(n)

🔹 Space Complexity: O(1)

5. Java Program: Max Sum Subarray of Size K


🔹 Java Code:
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];
int maxSum = windowSum;

for (int i = k; i < arr.length; i++) {


windowSum += arr[i] - arr[i - k];
maxSum = Math.max(maxSum, windowSum);
}
return maxSum;
}
public static void main(String[] args) {

int[] arr = {2, 1, 5, 1, 3, 2};


int k = 3;
System.out.println("Max sum of subarray of size K: " +
maxSumK(arr, k)); // Output: 9
}
}

🔹 Time Complexity: O(n)

🔹 Space Complexity: O(1)

6. Longest Substring Without Repeating Characters


🔹 Java Code:

import java.util.HashSet; public


class LongestUniqueSubstring {

public static int lengthOfLongestSubstring(String s) {

HashSet<Character> set = new HashSet<>();


int left = 0, maxLen = 0;
for (int right = 0; right < s.length(); right++) {

while (set.contains(s.charAt(right))) {
set.remove(s.charAt(left++));
}
set.add(s.charAt(right));
maxLen = Math.max(maxLen, right - left + 1);
}
return maxLen;
}

public static void main(String[] args) {


String str = "abcabcbb";
System.out.println("Length of Longest Unique Substring: " +
lengthOfLongestSubstring(str)); // 3
}
}

🔹 Time: O(n)

🔹 Space: O(k) (k = unique characters)

7. Sliding Window Technique (Explanation)


🔹 Concept:

A technique to solve problems involving contiguous subarrays or substrings using a


moving window.

🔹 How It Works:

• Maintain a window (usually of fixed or variable size).


• Move it forward while updating results based on constraints.

🔹 Used in:

• Maximum/minimum sum of size k


• Longest substring without repeating characters
• Counting distinct elements in a window
• Checking anagram existence in another string

8. Longest Palindromic Substring

🔹 Java Code:
public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {

int len1 = expand(s, i, i); // Odd


int len2 = expand(s, i, i + 1); // Even
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);
}
private static int expand(String s, int left, int right) {

while (left >= 0 && right < s.length() && s.charAt(left) ==


s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}
public static void main(String[] args) {

String str = "babad";


System.out.println("Longest Palindromic Substring: " +
longestPalindrome(str)); // "bab" or "aba"
}
}

🔹 Time: O(n^2)

🔹 Space: O(1)
9. Longest Common Prefix (LCP)
🔹 Java Code:

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;
}

public static void main(String[] args) {

String[] strs = {"flower", "flow", "flight"};


System.out.println("Longest Common Prefix: " +
longestCommonPrefix(strs)); // "fl"
}
}

🔹 Time: O(n * m)

🔹 Space: O(1)

n = number of strings, m = length of smallest string

10. Generate All Permutations of a String


🔹 Java Code:
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
}
}
}
private static void swap(char[] arr, int i, int j) {

char temp = arr[i];


arr[i] = arr[j];
arr[j] = temp;
}

public static void main(String[] args) {


String str = "ABC";
permute(str.toCharArray(), 0, str.length() - 1);
}
}

🔹 Time: O(n * n!)

🔹 Space: O(n)

11. Two Numbers in a Sorted Array That Add Up to Target


🔹 Java Code:

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};
}
public static void main(String[] args) {

int[] arr = {1, 2, 3, 4, 6};


int[] result = twoSum(arr, 6);
System.out.println("Indices: " + result[0] + ", " +
result[1]); // 1, 3
}
}

🔹 Time: O(n)

🔹 Space: O(1)

12. Next Lexicographical Permutation


🔹 Java Code:

import java.util.Arrays;
public class NextPermutation {

public static 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);


}
private static void swap(int[] nums, int i, int j) {

int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp;


}

private static void reverse(int[] nums, int start, int end) {


while (start < end) swap(nums, start++, end--);
}

public static void main(String[] args) {


int[] nums = {1, 2, 3};
nextPermutation(nums);
System.out.println(Arrays.toString(nums)); // [1, 3, 2]
}
}

🔹 Time: O(n)

🔹 Space: O(1)

13. Merge Two Sorted Linked Lists

🔹 Java Code:

class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }

}
public class MergeSortedLists {
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1), tail = dummy;

while (l1 != null && l2 != null) {


if (l1.val < l2.val) {
tail.next = l1; l1 = l1.next;
} else {

tail.next = l2; l2 = l2.next;


}
tail = tail.next;
}
tail.next = (l1 != null) ? l1 : l2;
return dummy.next;

}
}
🔹 🔹Time: O(n + m)
Space: O(1)

14. Median of Two Sorted Arrays

🔹 Java Code:

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;
int low = 0, high = m;
while (low <= high) {

int i = (low + high) / 2;


int j = (m + n + 1) / 2 - i;
int maxLeftA = (i == 0) ? Integer.MIN_VALUE : A[i - 1];
int minRightA = (i == m) ? Integer.MAX_VALUE : A[i];
int maxLeftB = (j == 0) ? Integer.MIN_VALUE : B[j - 1];
int minRightB = (j == n) ? Integer.MAX_VALUE : B[j];

if (maxLeftA <= minRightB && maxLeftB <= minRightA) {


if ((m + n) % 2 == 0)
return (Math.max(maxLeftA, maxLeftB) +
Math.min(minRightA, minRightB)) / 2.0;
else
return Math.max(maxLeftA, maxLeftB);
} else if (maxLeftA > minRightB)
high = i - 1;
else
low = i + 1;
}
return 0.0;
}

public static void main(String[] args) {

int[] A = {1, 3};


int[] B = {2};
System.out.println(findMedianSortedArrays(A, B)); // 2.0
}
}

🔹 Time: O(log(min(m,n)))

🔹 Space: O(1)

15. K-th Smallest in Sorted Matrix

🔹 Java Code:

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];
while (low < high) {
int mid = (low + high) / 2;
int count = 0, j = n - 1;

for (int i = 0; i < n; i++) {


while (j >= 0 && matrix[i][j] > mid) j--;
count += (j + 1);
}
if (count < k) low = mid + 1;
else high = mid;

return low;
}
public static void main(String[] args) {

int[][] matrix = {
{1, 5, 9},
{10, 11, 13},
{12, 13, 15}
};
System.out.println(kthSmallest(matrix, 8)); // 13
}
}

🔹 Time: O(n log(max-min))

🔹 Space: O(1)

16. Majority Element (> n/2 times)


🔹 Java Code:

public class MajorityElement {

public static int findMajority(int[] nums) {


int count = 0, candidate = 0;
for (int num : nums) {

if (count == 0) candidate = num;


count += (num == candidate) ? 1 : -1;
}
return candidate;

}
public static void main(String[] args) {

int[] nums = {2, 2, 1, 1, 1, 2, 2};


System.out.println("Majority Element: " + findMajority(nums));
// 2
}
}

🔹 🔹Time: O(n)
Space: O(1)

17. Trapping Rain Water

🔹 Java Code:

public class TrappingRainWater {

public static int trap(int[] height) {


int left = 0, right = height.length - 1, res = 0;
int leftMax = 0, rightMax = 0;
while (left < right) {

if (height[left] < height[right]) {


if (height[left] >= leftMax) leftMax = height[left];
else res += leftMax - height[left];
left++;
} else {
if (height[right] >= rightMax) rightMax =
height[right];
else res += rightMax - height[right];
right--;
}
}
return res;
}
public static void main(String[] args) {
int[] height = {0, 1, 0, 2, 1, 0, 1, 3};
System.out.println("Trapped Water: " + trap(height)); // 6
}
}

🔹 Time: O(n)

🔹 Space: O(1)

18. Maximum XOR of Two Numbers in Array

🔹 Java Code:

import
java.util.HashSet;
public class MaxXOR {

public static int findMaximumXOR(int[] nums) {


int max = 0, mask = 0;

for (int i = 31; i >= 0; i--) {


mask |= (1 << i);
HashSet<Integer> set = new HashSet<>();
for (int num : nums) set.add(num & mask);
int temp = max | (1 << i);
for (int prefix : set) {

if (set.contains(temp ^ prefix)) {
max = temp;
break;
}
}
}
return max;
}
public static void main(String[] args) {

int[] nums = {3, 10, 5, 25, 2, 8};


System.out.println("Max XOR: " + findMaximumXOR(nums)); // 28
}
}

🔹 Time: O(n)

🔹 Space: O(n)

19. Maximum Product Subarray


🔹 Java Code:

public class MaxProductSubarray {

public static int maxProduct(int[] nums) {


int max = nums[0], min = nums[0], result = nums[0];
for (int i = 1; i < nums.length; i++) {

int temp = max;


max = Math.max(nums[i], Math.max(max * nums[i], min *
nums[i]));
min = Math.min(nums[i], Math.min(temp * nums[i], min *
nums[i]));
result = Math.max(result, max);
}
return result;
}
public static void main(String[] args) {

int[] nums = {2, 3, -2, 4};


System.out.println("Max Product: " + maxProduct(nums)); // 6
}
}

Time: O(n)

Space: O(1)

20. Count All Numbers with Unique Digits

🔹 Java Code:

public class UniqueDigitNumbers {

public static int countNumbersWithUniqueDigits(int n) {


if (n == 0) return 1;
int res = 10, uniqueDigits = 9, available = 9;
for (int i = 2; i <= n && available > 0; i++) {

uniqueDigits *= available;
res += uniqueDigits;
available--;
}
return res;

}
public static void main(String[] args) {

System.out.println(countNumbersWithUniqueDigits(2)); // 91
}
}

🔹 Time: O(n)

🔹 Space: O(1)

21. Count 1s in Binary Representations from 0 to n

,
Java Code:

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;
}

Time Complexity: O(n)


Space Complexity: O(n)

Example: n = 5 → Output: [0,1,1,2,1,2]


22. Check Power of Two using Bit Manipulation

Code: .
public boolean isPowerOfTwo(int n)
{
return n > 0 && (n & (n - 1)) == 0;

Time Complexity: O(1)


Space Complexity: O(1)

Example: n = 8 → Output: true

23. Maximum XOR of Two Numbers in Array

Java Code:
class TrieNode {

TrieNode[] child = new TrieNode[2];


}

public int findMaximumXOR(int[] nums) {


TrieNode root = new TrieNode();
for (int num : nums) {
TrieNode node = root;
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
if (node.child[bit] == null)
node.child[bit] = new TrieNode();
node = node.child[bit];
}
}
int maxXOR = 0;
for (int num : nums) {
TrieNode node = root;
int currXOR = 0;
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
if (node.child[bit ^ 1] != null) {
currXOR |= (1 << i);
node = node.child[bit ^ 1];
} else {
node = node.child[bit];
}
}
m a x X O R = M a t h . m a x ( m a x X O R , c u r r X
} }
return maxXOR;

Time Complexity: O(n * 32)


Space Complexity: O(n * 32)

Example: [3, 10, 5, 25, 2, 8] → Output: 28

24. Bit Manipulation Concept

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)

25. Next Greater Element in Array

Java Code:
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;
}

Time Complexity: O(n)


Space Complexity: O(n)

Example: [2,1,2,4,3] → Output: [4,2,4,-1,-1]

26. Remove N-th Node from End of List

Java Code: n
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;
}

Time Complexity: O(n)


Space Complexity: O(1)

Example: [1,2,3,4,5], n=2 → Output: [1,2,3,5]

27. Intersection of Two Linked Lists

Java Code:

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)

Example: List A: [4,1,8,4,5], B: [5,6,1,8,4,5] → Output: 8

28. Implement Two Stacks in One Array

Java Code:
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;
} }

Time Complexity: O(1)


Space Complexity: O(n)

Example: Push elements in two stacks from same array.

29. Check Palindrome Integer Without String

Java Code:

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;
}
} r e t u r n x = = r e v | | x = = r e v / 1 0

Time Complexity: O(log n)


Space Complexity: O(1)

Example: 121 → Output: true


30. Linked List Concept and Applications
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:

• Implementing stacks and queues


• Dynamic memory allocation
• Polynomial manipulation
• Adjacency representation in graphs

31. Maximum in Every Sliding Window of Size K (Deque Approach)


Java Code:
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)

Example: [1,3,-1,-3,5,3,6,7], k=3 → Output: [3,3,5,5,6,7]


32. Largest Rectangle in Histogram

Java Code:
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;
}

Time Complexity: O(n)


Space Complexity: O(n)

Example: [2,1,5,6,2,3] → Output: 10

33. Sliding Window Technique (Explanation)

Concept: Efficiently process subsets of data using a fixed-size or variable-size window,


avoiding recomputation.
Use Cases:

• Maximum/Minimum in window
• Longest substring without repeating characters
• Average of subarrays
34. Subarray Sum Equals K (Hashing)

Code:
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;
}

Time Complexity: O(n)


Space Complexity: O(n)

Example: [1,2,3], k=3 → Output: 2

35. K Most Frequent Elements (Priority Queue)

Java Code:
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);
PriorityQueue<Integer> pq = new PriorityQueue<>(
(a, b) -> map.get(a) - map.get(b)
);

for (int key : map.keySet()) {


pq.offer(key);
if (pq.size() > k)
pq.poll();
}

int[] res = new int[k];


for (int i = k - 1; i >= 0; i--)
res[i] = pq.poll();
return res;
}

Time Complexity: O(n log k)


Space Complexity: O(n)

Example: [1,1,1,2,2,3], k=2 → Output: [1,2]

36. Generate All Subsets (Power Set)


Backtracking):
public List<List<Integer>> subsets(int[] nums)
{ List<List<Integer>> res = new ArrayList<>();
backtrack(res, new ArrayList<>(), nums, 0);
return res;

}
private void backtrack(List<List<Integer>> res, List<Integer> temp,
int[] nums, int start) {

res.add(new ArrayList<>(temp));
for (int i = start; i < nums.length; i++) {
temp.add(nums[i]);
backtrack(res, temp, nums, i + 1);
temp.remove(temp.size() - 1);
}
}
Time Complexity: O(2^n)
Space Complexity: O(2^n)

Example: [1,2] → Output: [[],[1],[2],[1,2]]

37. Unique Combinations That Sum to Target


Java Code:
public List<List<Integer>> combinationSum(int[] candidates, int
target) {

List<List<Integer>> res = new ArrayList<>();

backtrack(candidates, target, 0, new ArrayList<>(), res);


} return res;
private void backtrack(int[] candidates, int target, int start,
List<Integer> temp, List<List<Integer>> res) {

if (target == 0) {
res.add(new ArrayList<>(temp));
return;
}
for (int i = start; i < candidates.length; i++) {
if (candidates[i] > target) continue;
temp.add(candidates[i]);
backtrack(candidates, target - candidates[i], i, temp, res);
temp.remove(temp.size() - 1);
}
}

Time Complexity: O(2^t), where t = target


Space Complexity: O(target)

Example: candidates = [2,3,6,7], target = 7 → Output: [[2,2,3],[7]]


38. Permutations of an Array

Java Code:

public List<List<Integer>> permute(int[] nums) {


List<List<Integer>> res = new ArrayList<>();
backtrack(nums, 0, res);
return res;
}
private void backtrack(int[] nums, int start, List<List<Integer>> res)

{
if (start == nums.length) {
List<Integer> temp = new ArrayList<>();
for (int num : nums) temp.add(num);
res.add(temp);
return;
}
for (int i = start; i < nums.length; i++) {
swap(nums, i, start);
backtrack(nums, start + 1, res);
swap(nums, i, start);
}
}
private void swap(int[] nums, int i, int j) {

int tmp = nums[i];


nums[i] = nums[j];
nums[j] = tmp;
}

Time Complexity: O(n!)


Space Complexity: O(n)

Example: [1,2] → Output: [[1,2],[2,1]]


39. Difference Between Subsets and Permutations

Explanation:

• Subsets: Any combination of elements, order doesn’t matter. Example: {1, 2} →


{1}, {2}, {1, 2}, {}
• Permutations: All possible arrangements, order matters. Example: {1, 2} →
[1,2], [2,1]

Key Differences:

• Count of subsets: 2^n

• Count of permutations: n!

40. Element with Maximum Frequency in Array

Java Code:
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;
}

Time Complexity: O(n)


Space Complexity: O(n)

Example: [1,3,2,2,3,1,1] → Output: 1

41. Maximum Subarray Sum (Kadane’s Algorithm)

Java Code:
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

42. Dynamic Programming in Maximum Subarray

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

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)

43. Top K Frequent Elements

Java Code:

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);

PriorityQueue<Integer> pq = new PriorityQueue<>(


(a, b) -> map.get(a) - map.get(b)
);

for (int key : map.keySet()) {


pq.add(key);
if (pq.size() > k)
pq.poll();
}

int[] result = new int[k];


for (int i = 0; i < k; i++)
result[i] = pq.poll();
return result;
}

Time: O(n log k)


Space: O(n)
44. Two Numbers Add to Target (Hashing)
Java Code:

public int[] twoSum(int[] nums, int target) {

Map<Integer, Integer> map = new HashMap<>();


for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement))
return new int[]{map.get(complement), i};
map.put(nums[i], i);
}
return new int[]{-1, -1};
}

Time: O(n)
Space: O(n)

45. Priority Queue Concept


Explanation:

• A PriorityQueue is a heap-based data structure.


• Elements are ordered based on natural ordering or custom
comparator.
• Use Cases: Dijkstra's algorithm, Top-K problems, job scheduling.

46. Longest Palindromic Substring


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);
}
private int expandFromCenter(String s, int left, int right) {

while (left >= 0 && right < s.length() && s.charAt(left) ==


s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}

Time: O(n²)
Space: O(1)

47. Histogram Problem Concept

Concept:

• Largest rectangle under histogram bars.


• Applications: Max area in binary matrix, skyline problem.
• Techniques: Stack, Divide & Conquer.
48. Next Permutation

Java Code:

java

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);
}
private void reverse(int[] nums, int start, int end) {

while (start < end)


swap(nums, start++, end--);
}
private void swap(int[] nums, int i, int j) {

int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp;


}

Time: O(n)
Space: O(1)

49. Intersection of Two Linked Lists


Java Code:

java

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)

50. Equilibrium Index (Concept)


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.

You might also like