From 16e65a901dba6233f38b69827b19b8aaf1b767e7 Mon Sep 17 00:00:00 2001 From: gparidhi51 <107466033+gparidhi51@users.noreply.github.com> Date: Fri, 15 Mar 2024 16:00:07 +0530 Subject: [PATCH] Initial Commit --- .../Advanced/DSA Arrays 1 One Dimensional.md | 667 +++++++ .../Advanced/DSA Arrays 2 Two Dimensional.md | 568 ++++++ .../DSA Arrays 3 Interview Problems.md | 456 +++++ .../Advanced/DSA Backtracking.md | 482 +++++ .../Advanced/DSA Bit Manipulation 1.md | 455 +++++ .../Advanced/DSA Bit Manipulation 2.md | 437 +++++ .../Advanced/DSA DP 1 One Dimentional.md | 342 ++++ .../Advanced/DSA DP 2 Two Dimentional.md | 724 ++++++++ .../Advanced/DSA DP 3 Knapsack.md | 312 ++++ .../DSA DP 4 Applications of Knapsack.md | 274 +++ ...s 1 Introduction, DFS & Cycle Detection.md | 499 ++++++ ...FS, Matrix Questions & Topological Sort.md | 417 +++++ ...phs 3 MST (Prims Algo.) & Dijkstra Algo.md | 239 +++ .../Advanced/DSA Greedy.md | 841 +++++++++ .../Advanced/DSA Hashing 1 Introduction.md | 561 ++++++ .../Advanced/DSA Hashing 2 Problems.md | 490 +++++ ...ng 3 Internal Implementation & Problems.md | 459 +++++ .../Advanced/DSA Heaps 1 Introduction.md | 557 ++++++ .../Advanced/DSA Heaps 2 Problems.md | 567 ++++++ .../Advanced/DSA Interview Problems.md | 351 ++++ ...A Language Advanced Concept Collections.md | 1071 +++++++++++ .../DSA Linked List 1 Introduction.md | 600 +++++++ ...inked List 2 Sorting and Detecting Loop.md | 503 ++++++ ...ed List 3 Problems & Doubly Linked List.md | 340 ++++ .../DSA Maths 1 Modular Arithmetic & GCD.md | 438 +++++ .../DSA Maths 2 Combinatorics Basics.md | 339 ++++ .../Advanced/DSA Maths 3 Prime Numbers.md | 300 ++++ .../Advanced/DSA OOPS 1 Introduction.md | 488 +++++ ...Constuctors, Inheritance & Polymorphism.md | 660 +++++++ .../DSA Queues Implementation & Problems.md | 500 ++++++ .../Advanced/DSA Recursion 1.md | 374 ++++ .../Advanced/DSA Recursion 2.md | 547 ++++++ .../DSA Searching 1 Binary Search on Array.md | 488 +++++ .../DSA Searching 2 Binary Search Problems.md | 569 ++++++ ...DSA Searching 3 Binary Search on Answer.md | 441 +++++ .../DSA Sorting 1 Count Sort & Merge Sort.md | 556 ++++++ ...ting 2 Quick Sort & Comparator Problems.md | 606 +++++++ ...tacks 1 Implementation & Basic Problems.md | 507 ++++++ ...ks 2 Nearest Smaller or Greater Element.md | 506 ++++++ .../DSA Trees 1 Structure & Traversal.md | 521 ++++++ .../Advanced/DSA Trees 2 Views & Types.md | 601 +++++++ .../Advanced/DSA Trees 3 BST.md | 484 +++++ ... Trees 4 LCA + Morris Inorder Traversal.md | 726 ++++++++ .../Advanced/DSA Trees 5 Problems on Trees.md | 587 ++++++ .../Advanced/DSA Two Pointers.md | 645 +++++++ .../Beginner Data Types 2 + Reading .md | 1070 +++++++++++ .../Beginner Language/Beginner Data Types.md | 722 ++++++++ .../Beginner Language/Beginner Patterns 1.md | 597 +++++++ ...r Patterns 2 & Introduction to Strings.md | 550 ++++++ .../Beginner 1D Array - 1.md | 688 +++++++ .../Beginner 1D Array - 2.md | 606 +++++++ .../Beginner 2D Array - 1.md | 663 +++++++ .../Beginner 2D Array - 2.md | 745 ++++++++ .../Beginner Functions - 1.pdf | Bin 0 -> 293729 bytes .../Beginner Functions - 2.pdf | Bin 0 -> 969059 bytes .../Beginner Language/Beginner If-Else 1.md | 720 ++++++++ .../Beginner Language/Beginner If-Else 2.md | 666 +++++++ ...ginner Introduction to Beginner Module.pdf | Bin 0 -> 625686 bytes .../Beginner Language/Beginner Loop - 1.md | 628 +++++++ .../Beginner Language/Beginner Loop - 2.md | 599 +++++++ ...er Maths Basics & Calculate Iterations.pdf | Bin 0 -> 744581 bytes .../Beginner Language/Beginner Operators.md | 958 ++++++++++ .../Beginner Output & Basic Data Types.md | 1056 +++++++++++ .../Beginner Problems on Arrays.md | 412 +++++ .../Beginner String Implementation.md | 379 ++++ .../Intermediate DSA Arrays 2D Matrices.md | 480 +++++ ...Sliding Window & Contribution Technique.md | 393 ++++ ... DSA Arrays - Carry Forward & Subarrays.md | 400 +++++ .../Intermediate DSA Arrays - Prefix Sum.md | 599 +++++++ ...termediate DSA Bit Manipulations Basics.md | 484 +++++ .../Intermediate DSA Interview Problems.md | 541 ++++++ ...Intermediate DSA Introduction to Arrays.md | 477 +++++ ...ate DSA Introduction to Problem Solving.md | 420 +++++ .../Intermediate DSA Memory Management.md | 523 ++++++ .../Intermediate DSA Sorting Basics.md | 454 +++++ .../Intermediate/Intermediate DSA Strings.md | 382 ++++ .../Intermediate DSA Time Complexity.md | 565 ++++++ .../Java Refresher/Refresher 1D Arrays.md | 315 ++++ .../Java Refresher/Refresher 2D Arrays.md | 445 +++++ .../Java Refresher/Refresher Arraylists.md | 423 +++++ .../Java Refresher/Refresher For Loop.md | 525 ++++++ .../Java Refresher/Refresher Functions.md | 359 ++++ .../Refresher HashMap & HashSet.md | 518 ++++++ .../Refresher Introduction to Java If-Else.md | 683 +++++++ ...put and Output + Data Types + Operators.md | 476 +++++ .../Java Refresher/Refresher Patterns.md | 493 +++++ .../Java Refresher/Refresher Strings.md | 279 +++ .../Java Refresher/Refresher While Loop.md | 561 ++++++ ...r Introduction To Python and Data Types.md | 1464 +++++++++++++++ .../Python Refresher/Refresher Iteration 1.md | 505 ++++++ .../Python Refresher/Refresher Iteration 2.md | 486 +++++ .../Python Refresher/Refresher List 1.md | 936 ++++++++++ .../Python Refresher/Refresher List 2.md | 284 +++ .../Python Refresher/Refresher List 3.md | 222 +++ ...resher Operators and Control Statements.md | 1592 +++++++++++++++++ .../Refresher Sets and Dictionaries.md | 1196 +++++++++++++ .../Python Refresher/Refresher Strings 2.md | 677 +++++++ .../Refresher Tuples + Strings 1.md | 684 +++++++ 98 files changed, 52995 insertions(+) create mode 100644 Academy DSA Typed Notes/Advanced/DSA Arrays 1 One Dimensional.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Arrays 2 Two Dimensional.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Arrays 3 Interview Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Backtracking.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Bit Manipulation 1.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Bit Manipulation 2.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA DP 1 One Dimentional.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA DP 2 Two Dimentional.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA DP 3 Knapsack.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA DP 4 Applications of Knapsack.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Graphs 1 Introduction, DFS & Cycle Detection.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Graphs 2 BFS, Matrix Questions & Topological Sort.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Graphs 3 MST (Prims Algo.) & Dijkstra Algo.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Greedy.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Hashing 1 Introduction.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Hashing 2 Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Hashing 3 Internal Implementation & Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Heaps 1 Introduction.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Heaps 2 Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Interview Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Language Advanced Concept Collections.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Linked List 1 Introduction.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Linked List 2 Sorting and Detecting Loop.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Linked List 3 Problems & Doubly Linked List.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Maths 1 Modular Arithmetic & GCD.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Maths 2 Combinatorics Basics.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Maths 3 Prime Numbers.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA OOPS 1 Introduction.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA OOPS 2 Constuctors, Inheritance & Polymorphism.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Queues Implementation & Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Recursion 1.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Recursion 2.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Searching 1 Binary Search on Array.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Searching 2 Binary Search Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Searching 3 Binary Search on Answer.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Sorting 1 Count Sort & Merge Sort.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Sorting 2 Quick Sort & Comparator Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Stacks 1 Implementation & Basic Problems.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Stacks 2 Nearest Smaller or Greater Element.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Trees 1 Structure & Traversal.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Trees 2 Views & Types.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Trees 3 BST.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Trees 4 LCA + Morris Inorder Traversal.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Trees 5 Problems on Trees.md create mode 100644 Academy DSA Typed Notes/Advanced/DSA Two Pointers.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Data Types 2 + Reading .md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Data Types.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Patterns 1.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Patterns 2 & Introduction to Strings.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 1.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 2.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 1.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 2.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Functions - 1.pdf create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Functions - 2.pdf create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner If-Else 1.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner If-Else 2.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Introduction to Beginner Module.pdf create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Loop - 1.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Loop - 2.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Maths Basics & Calculate Iterations.pdf create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Operators.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Output & Basic Data Types.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner Problems on Arrays.md create mode 100644 Academy DSA Typed Notes/Beginner Language/Beginner String Implementation.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Arrays 2D Matrices.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Arrays Sliding Window & Contribution Technique.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Arrays - Carry Forward & Subarrays.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Arrays - Prefix Sum.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Bit Manipulations Basics.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Interview Problems.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Introduction to Arrays.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Introduction to Problem Solving.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Memory Management.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Sorting Basics.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Strings.md create mode 100644 Academy DSA Typed Notes/Intermediate/Intermediate DSA Time Complexity.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher 1D Arrays.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher 2D Arrays.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher Arraylists.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher For Loop.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher Functions.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher HashMap & HashSet.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher Introduction to Java If-Else.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher Introduction to Java Input and Output + Data Types + Operators.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher Patterns.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher Strings.md create mode 100644 Academy DSA Typed Notes/Java Refresher/Refresher While Loop.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Introduction To Python and Data Types.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Iteration 1.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Iteration 2.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher List 1.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher List 2.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher List 3.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Operators and Control Statements.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Sets and Dictionaries.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Strings 2.md create mode 100644 Academy DSA Typed Notes/Python Refresher/Refresher Tuples + Strings 1.md diff --git a/Academy DSA Typed Notes/Advanced/DSA Arrays 1 One Dimensional.md b/Academy DSA Typed Notes/Advanced/DSA Arrays 1 One Dimensional.md new file mode 100644 index 0000000..37bcc8f --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Arrays 1 One Dimensional.md @@ -0,0 +1,667 @@ +# Arrays 1: One Dimensional + +## Problem 1 Find Maximum Subarray Sum + +### Problem Statement +Given an integer array A, find the maximum subarray sum out of all the subarrays. + +### Examples +**Example 1**: +For the given array A with length N, + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +|:-----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| Array | -2 | 3 | 4 | -1 | 5 | -10 | 7 | + +**Output:** +```plaintext +Max Sum: 11 +Subarray: 3 4 -1 5 +``` + + +**Example 2:** +For the given array A with it's length as N we have, + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +|:-----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| Array | -3 | 4 | 6 | 8 | -10 | 2 | 7 | + +**Output:** +```plaintext +Max Sum: 18 +Subarray: 4 6 8 +``` + +--- +### Question +For the given array A, what is the maximum subarray sum ? +A[ ] = { 4, 5, 2, 1, 6 } + +**Choices** +- [ ] 6 +- [x] 18 +- [ ] No Idea +- [ ] 10 + +```plaintext +Max Sum: 18 +Subarray: 4 5 2 1 6 +``` + +### Question +For the given array A, what is the maximum subarray sum ? +A[ ] = { -4, -3, -6, -9, -2 } + +**Choices** +- [ ] -9 +- [ ] 18 +- [x] -2 +- [ ] -24 + + +```plaintext +Max Sum: -2 +Subarray: -2 +``` + +--- +### Find Maximum Subarray Sum Brute Force + +#### Brute Force +No of possible subarrays: `N * (N + 1) / 2` + +Iterate over all subarrays, calculate sum and maintain the maximum sum. + +#### Psuedocode: +```java +ans = A[0]; +for (i = 0; i < N; i++) { // start to N + for (j = i; j < N; j++) { // end + for (k = i; k <= j; k++) { + sum += A[k]; + } + ans = Math.max(ans, sum); + sum = 0; // Reset sum for the next iteration + } +} +return ans; + +``` + +#### Complexity +**Time Complexity:** `O(N^2 * N) = O(N^3)` +**Space Complexity:** `O(1)` + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +--- +### Find Maximum Subarray Sum using Carry Forward +#### Optimized Solution using Carry Forward +We don't really need the third loop present in brute force, we can optimise it further using Carry Forward technique. + +#### Psuedocode +```java +ans = A[0] +for (i = 0 to N - 1) { //start to N + sum = 0 + for (j = i to N - 1) { //end + sum += A[k] + ans = max(ans, sum) + } +} +return ans; +``` + +#### Complexity +**Time Complexity:** O(N^2) +**Space Complexity:** O(1) + +--- +### Find Maximum Subarray Sum using Kadanes Algorithm + +#### Observation: + +**Case 1:** +If all the elements in the array are positive +Arr[] = `[4, 2, 1, 6, 7]` + +**Answer:** +To find the maximum subarray we will now add all the positive elements +Ans: `(4 + 2 + 1 + 6 + 7) = 20` + + +**Case 2:** + +If all the elements in the array are negative +Arr[] = `[-4, -8, -9, -3, -5]` + +**Answer:** +Here, since a subarray should contain at least one element, the max subarray would be the element with the max value +Ans: `-3` + + +**Case 3:** + +If positives are present in between +Arr[] = [-ve -ve -ve `+ve +ve +ve +ve` -ve -ve -ve] + +**Answer:** +Here max sum would be the sum of all positive numbers + + +**Case 4:** +If all negatives are present either on left side or right side. +Arr[ ] = [-ve -ve -ve `+ve +ve +ve +ve`] +OR +Arr[ ] = [`+ve +ve +ve +ve` -ve -ve -ve -ve] + +**Answer:** +All postives on sides + + + +Case 5 : +**Hint:** +What if it's some ve+ followed by some ve- and then again some more positives... + +```plaintext ++ve +ve +ve -ve -ve -ve +ve +ve +ve +ve +ve +``` + +#### Solution: +We will take all positives, then we consider negatives only if the overall sum is positive because in the future if positives come, they may further increase this positivity(sum). + + +**Example** - +```plaintext +A[ ] = { -2, 3, 4, -1, 5, -10, 7 } +``` +Answer array: 3, 4, -1, 5 + + +**Explanation**: +3+4 = 7 +7 + (-1) = 6 (still positive) +6+5 = 11 (higher than 7) + +#### Dry Run +```plaintext + 0 1 2 3 4 5 6 7 8 +{ -20, 10, -20, -12, 6, 5, -3, 8, -2 } +``` + +| i | currSum | maxSum | | +|:---:|:-------:|:------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| 0 | -20 | -20 | reset the currSum to 0 and do not propagate since adding a negative will make it more negative and adding a positive will reduce positivity of that element. | + +currSum = 0 + +| i | currSum | maxSum | | +|:---:|:-------------:|:------:|:------------------:| +| 1 | 10 | 10 | | +| 2 | 10 + (-20)= -10 | 10 | reset currSum to 0 | + + + +currSum = 0 + +| i | currSum | maxSum | | +|:---:|:-------:|:------:|:------------------:| +| 3 | -12 | 10 | reset currSum to 0 | + + + +currSum = 0 + +| i | currSum | maxSum | | +|:---:|:---------:|:------:|:---------------------------------------------------------------------------:| +| 4 | 6 | 10 | | +| 5 | 6 + 5 | 11 | | +| 6 | 6 + 5 - 3 = 8 | 11 | Keep currSum as 8 only since if we find a positive, it can increase the sum | + +| i | currSum | maxSum | | +|:---:|:-------:|:------:| --------------------------------------------------------------------------- | +| 7 | 8 + 8 = 16 | 16 | | +| 8 | 16 - 2 = 14 | 16 | Keep currSum as 8 only since if we find a positive, it can increase the sum | + +Final maxSum = 16 + +--- +### Question +Tell the output of the below example after running the Kadane's Algorithm on that example +A[ ] = { -2, 3, 4, -1, 5, -10, 7 } + +**Choices** +- [ ] 9 +- [ ] 7 +- [x] 11 +- [ ] 0 + +--- +### Find Maximum Subarray Sum Kadanes Pseudocode + +#### Pseudocode + +```cpp +int maximumSubarraySum(int[] arr, int n) { + int maxSum = Integer.MIN_VALUE, currSum = 0; + + for (int i = 0; i <= n - 1; i++) { + currSum += arr[i]; + + if (currSum > maxSum) { + maxSum = currSum; + } + + if (currSum < 0) { + currSum = 0; + } + } + + return maxSum; +} +``` + +#### Complexity +**Time Complexity:** O(n) +**Space Complexity:** O(1) + +The optimized method that we just discussed comes under **Kadane's Algorithm** for solving maximum subarray problem + +--- +### Problem 2 Perform multiple Queries from i to last index + + +#### Problem Statement + +Given an integer array A where every element is 0, return the final array after performing multiple queries + +**Query (i, x):** Add x to all the numbers from index i to N-1 + +**Example** +Let's say we have a zero-filled array of size 7 with the following queries: + +Query(1, 3) +Query(4, -2) +Query(3, 1) + +Let's perform these queries and see how it works out. + +**Example Explanation** +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +| ----- | --- | --- | --- | --- | --- | --- | ----- | +| **Array** | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| **Q1** | : | +3 | +3 | +3 | +3 | +3 | +3| +| **Q2** | : | : | : | : | -2 | -2 | -2| +| **Q3** | : | : | : | +1 | +1 | +1 | +1 +| **Ans[]** | 0 | 3 | 3 | 4 | 2 | 2 | 2 | + + +--- +### Question +Return the final array after performing the queries + +**Note:** +- **Query (i, x):** Add x to all the numbers from index i to N-1 +- 0-based Indexing + + +```cpp +A = [0, 0, 0, 0, 0] +Query(1, 3) +Query(0, 2) +Query(4, 1) +``` + +**Choices** +- [ ] [6, 6, 6, 6, 6] +- [x] [2, 5, 5, 5, 6] +- [ ] [2, 3, 3, 3, 1] +- [ ] [2, 2, 5, 5, 6] + + +--- + +#### Explanation +| Index | 0 | 1 | 2 | 3 | 4 | +| ----- | --- | --- | --- | --- | --- | +| **Array** | 0 | 0 | 0 | 0 | 0 | +| **Q1** | : | +3 | +3 | +3 | +3 | +| **Q2** | +2 | +2 | +2 | +2 | +2 | +| **Q3** | : | : | : | : | +1 | +| **Ans[]** | 2 | 5 | 5 | 5 | 6 | + + +--- +### Perform multiple Queries from i to last index Solution Approaches + +#### Brute force Approach +One way to approach this question is for a given number of Q queries, we can traverse the entire array each time. + + +#### Complexity +**Time Complexity:** O(Q * N) +**Space Complexity:** O(1) + + +#### Optimized Solution + +#### Hint: +* Wherever we're adding the value initially, the value is to be carried forward to the very last of the array isn't it? +* Which is the concept that helps us carry forward the sum to indices on right hand side ? + +Expected: **Prefix Sum!** + +* Idea is that first we add the values at the ith indices as per given queries. +* Then, at the end, we can propagate those sum to indices on right. +* This way, we're only iterating over the array once unlike before. + +#### Dry Run +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +| --------- | --- | --- | --- | --- | --- | --- | --- | +| **Array** | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| **Q1** | : | +3 | : | : | : | : | : | +| **Q2** | : | : | : | : | +2 | : | | +| **Q3** | : | : | : | +1 | : | : | : | +| **Ans[]** | 0 | 3 | 0 | 1 | 2 | 0 | 0 | +| **psum[]** | 0 | 3 | 3 | 4 | 6 | 6 | 6 | + +#### Pseudocode +```cpp +for (i = 0; i < Q.length; i++) { + index = B[i][0]; + val = B[i][1]; + A[index] += val; +} +for (i = 1; i < N; i++) { + A[i] += A[i - 1]; +} +return A; +``` + +#### Complexity +**Time Complexity:** O(Q + N) +**Space Complexity:** O(1) since we are only making changes to the answer array that needs to be returned. + +--- +### Problem 3 Perform multiple Queries from index i to j + +#### Problem Statement + +Given an integer array A such that all the elements in the array are 0. Return the final array after performing multiple queries + +`Query: (i, j, x)`: Add x to all the elements from index i to j + +Given that `i <= j` + +**Examples** +Let's take an example, say we have the zero-filled array of size 7 and the queries are given as +q1 = (1, 3, 2) +q2 = (2, 5, 3) +q3 = (5, 6, -1) + +--- +### Question +Find the final array after performing the given queries on array of size **8**. + |i | j | x | + |- | - | - | + | 1 | 4 | 3 | + | 0 | 5 |-1 | + | 2 | 2 | 4 | + | 4 | 6 | 3 | + + +**Choices** +- [ ] 1 2 6 3 5 2 3 0 +- [ ] -1 2 6 2 5 2 3 3 +- [x] -1 2 6 2 5 2 3 0 +- [ ] 1 2 6 3 5 2 0 3 + +--- + +#### Observations +In the provided query format `Query: (i, j, x)` +here, start (i) and end (j) are specifiying a range wherein the values (x) needs to be added to the elements of the given array + +#### Brute force Solution Approach +In this solution we can iterate through the array for every query provided to us and perform the necessary operation over it. + +#### Dry Run +The provided queries we have are +q1 = (1, 3, 2) +q2 = (2, 5, 3) +q3 = (5, 6, -1) + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +| ------ | --- | --- | --- | --- | --- | --- | --- | +| Arr[7] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| V1 | | 2 | 2 | 2 | | | | +| V2 | | | 3 | 3 | 3 | 3 | | +| V3 | | | | | | -1 | -1 | +| Ans | 0 | 2 | 5 | 5 | 3 | 2 | -1 | + + +#### Complexity +**Time Complexity:** O(Q * N) +**Space Complexity:** O(1) + +#### Optimized Solution + +* This time, wherever we're adding the value initially, the value is to be carried forward only till a particular index, right? +* Can we use the Prefix Sum concept here are well ? +* How can we make sure that the value only gets added up till index j ? +* What can help us negate the effect of **+val** ? + +#### Idea +* We can add the value at the starting index and subtract the same value just after the ending index which will help us to only carry the effect of **+val** till a specific index. +* From the index(k) where we have done **-val**, the effect will neutralise i.e, from (k to N-1) + + +#### Pseudocode: +```cpp +zeroQ(int N, int start[], int end[], int val[]) { + long arr[N] = 0; + for (int i = 0; i < Q; i++) { + + //ith query information: start[i], end[i], val[i] + int s = start[i], e = end[i], v = val[i]; + + arr[s] = arr[s] + v; + + if (e < n - 1) { + arr[e + 1] = arr[e + 1] - v; + } + } + + //Apply cumm sum a psum[] on arr + for (i = 1; i < N; i++) { + arr[i] += arr[i - 1]; + } + + return arr; +} + +``` + + +#### Complexity +**Time Complexity:** O(Q + N) +**Space Complexity:** O(1) + + +**Problem Statement** +Given N buildings with height of each building, find the rain water trapped between the buildings. + +#### Example Explanation +Example: +arr[] = {2, 1, 3, 2, 1, 2, 4, 3, 2, 1, 3, 1} + +We now need to find the rainwater trapped between the buildings + + + +**Ans: 8** + +#### Hint: +If we get units of water stored over every building, then we can get the overall water by summing individual answers. + +#### Observations +1. How much water is stored over **building 2** ? **-> 4 units** + + + + +2. Now, how much water is stored over **building 2** ? **still -> 4 units** + + + +3. Now, how much water is stored over **building 2** ? **still -> 4 units** + + + +4. Now, how much water is stored over **building 2** ? **Now it is 6** + + +5. Now, how much water is stored over **building 2** ? **Now it is 8** + + +#### Conclusion: +It depends on the height of the minimum of the largest buildings on either sides. + +**Example:** +Water stored over building 5 depends on minimum of the largest building on either sides. +**i.e, min(10, 12) = 10** +**Water stored over 5 is 10 - 5 = 5 units.** + + + + +--- +### Question +Given N buildings with height of each building, find the rain water trapped between the buildings. + +`A = [1, 2, 3, 2, 1]` + +**Choices** +- [ ] 2 +- [ ] 9 +- [x] 0 +- [ ] 3 + + + +**Explanation:** + +No water is trapped, Since the building is like a mountain. + + + + + + + + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +--- +### Rain Water Trapping Brute Force Approach + +For **ith** building, +We need to find maximum heights on both the left and right sides of **ith** building. + +NOTE: For **0th** and **(N-1)th** building, no water will be stored on top. + +#### Pseudocode (Wrong) +```cpp +ans = 0 + +for (int i = 1; i < N - 1; i++) { + maxL = max(0 to i - 1); //loop O(N) + maxR = max(i + 1 to N - 1); //loop O(N) + + water = min(maxL, maxR) - A[i]; + ans += water; +} +``` + +#### Edge Case + + + +For building with height 4, the Lmax = 3 and Rmax = 3 +min(3, 3) = 3 +water = **3 - 4 < 0** + +So, for such case, we'll take water stored as 0. + +#### Pseudocode (Correct) +```cpp +ans = 0 + +for (int i = 1; i < N - 1; i++) { + maxL = max(0 to i - 1); //loop O(N) + maxR = max(i + 1 to N - 1); //loop O(N) + + water = min(maxL, maxR) - A[i]; + + if (water > 0) { + ans += water; + } +} +``` + +#### Complexity +**Time Complexity:** O(N^2) {Since for every element, we'll loop to find max on left and right} +**Space Complexity:** O(N) + +--- +### Rain Water Trapping Optimised Approach + +We can store the max on right & left using carry forward approach. + +* We can take 2 arrays, lmax[] & rmax[]. +* Below is the calculation for finding max on left & right using carry forward approach. +* This way, we don't have to find max for every element, as it has been pre-calculated. + + + +#### Pseudocode + +```cpp +ans = 0; + +int lmax[N] = { + 0 +}; +for (int i = 1; i < N; i++) { + lmax[i] = max(lmax[i - 1], A[i - 1]); +} + +int rmax[N] = { + 0 +}; +for (int i = N - 2; i >= 0; i--) { + rmax[i] = max(rmax[i + 1], A[i + 1]); +} + +for (int i = 1; i < N - 1; i++) { + water = min(lmax[i], rmax[i]) - A[i]; + + if (water > 0) { + ans += water; + } +} +``` + +#### Complexity +**Time Complexity:** O(N) {Since we have precalculated lmax & rmax} +**Space Complexity:** O(N) + + + diff --git a/Academy DSA Typed Notes/Advanced/DSA Arrays 2 Two Dimensional.md b/Academy DSA Typed Notes/Advanced/DSA Arrays 2 Two Dimensional.md new file mode 100644 index 0000000..b8e1967 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Arrays 2 Two Dimensional.md @@ -0,0 +1,568 @@ +# Advanced DSA : Arrays 2: Two Dimensional + +--- +## Problem 1 Find in rowise and colwise sorted matrix + +### Problem Statement +Given a row wise and column wise sorted matrix, find out whether element **k** is present or not. + +**Example** +Observe that rows and columns are both sorted. + + +**Test Case 1** + +13 => Present (true) + +**Test Case 2** + +2 => Present (true) + +**Test Case 3** +15 => Not Present (false) + +--- + +### Question +What is the brute force approach and the time complexity of it? + +**Choices** +- [ ] Iterate over first row; T.C - O(M) +- [ ] Iterate over last col; T.C - O(N) +- [x] Iterate over all rows & cols; T.C - O(N * M) +- [ ] Iterate over first col; T.C - O(N) + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Idea +* We shall exploit the property of the matrix being sorted. +* Start with the cell from where we can decide the next step. +**Example:** + +Search for: 0 + +Say we stand at **top left cell i.e, -5**. +Now, **-5 < 0**, can we determined the direction to search based on this? +No, because on rightside as well as downwards, the elements are in increasing order, so 0 can be present anywhere. + +Now, say we stand at **top right cell i.e, 13**. +Now,**13 > 0**, should we go left or down ? Can we decide ? +Yes, if we move down the elements are > 13, but we are looking for an element < 13, so we should move left. + +It means, all elements below 13, can be neglected. + + + +**Move Left** + + + +Now, where shall we move ? + +--- + +### Question +Say we are at 1 and want to find 0, where should we move ? + + + + +**Choices** +- [x] left +- [ ] bottom +- [ ] let's move in both the directions +- [ ] let's move everywhere + +--- +### Find in rowise and colwise sorted matrix Optimised Approach Continued + + +Since, **1 > 0**, again all elements below 1 are greater than 1, hence can be neglected. + + +**Move Left** + + +Now, **-2 < 0**, all elements on left of -2 are lesser than -2, hence can be neglected. + + + +**Move Down** + + + +#### Approach + +* We can start at top right cell. +* If A[i][j] < K, move down, else move left. +* Repeat until the element is found, our the search space is exhausted. + +**NOTE:** We could have also started at bottom left cell. + + +#### Pseudocode + +```cpp +int i = 0, j = M - 1 +while (i < N && j >= 0) { + if (arr[i][j] == K) { + return true; + } else if (arr[i][j] < K) { + i++; //move down; next row + } else { + j--; //move left; previous column + } +} +return false; +``` +#### Time & Space Complexity +**Time Complexity:** O(M+N) since at every step, we are either discarding a row or a column. Since total rows+columns are N+M, hence Iterations will be N+M. +**Space Complexity:** O(1) + +--- +### Problem 2 Row with maximum number of 1s + + +Given a binary sorted matrix A of size N x N. Find the row with the maximum number of 1. + +NOTE: + +* If two rows have the maximum number of 1 then return the row which has a lower index. +* Assume each row to be sorted by values. + + +**Example 1:** + + +**Output 1:** 0th row + + +**Example 2:** + + +**Output 2:** 3th row + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Brute Force + +We can iterate over each row and maintain the max number of 1s. + + +#### Complexity +**Time Complexity:** O(N * N) + + + +--- +### Question +Find the row with the maximum number of 1. +Note : If there are two rows with same no. of 1, consider the smaller row. +| **0** | **1** | **1** | **1** | +|---|---|---|---| +| **0** | **0** | **0** | **1** | +| **1** | **1** | **1** | **1** | +| **1** | **1** | **1** | **1** | + +**Choices** +- [ ] 0th Row +- [ ] 1st Row +- [x] 2nd Row +- [ ] 3rd Row + + + +--- + +### Optimisation Approach + +We know that rows are sorted, how can we utilise this property of the matrix ? + +#### Idea + +Say we start from top right of first row and saw that there are 2 ones. +Now, in the next row, we don't want to see 2 1s, rather we'll check if 3rd 1 is present or not? + + + +If yes, it means we have three 1s, but then we want to check if more 1s are there, so we'll move towards left in the same row and check. + + + +Now, in the subsequent rows, we'll proceed in the same manner. + +In 2nd and 3rd rows, 1 is not present at 1st index. + +In 4th row, it is present. So, we check on left if more 1s are present. + +In 4th row, we found the maximum 1s, i.e 5 in total. Hence that is our answer. + +#### Algorithm + +1. Start at i = 0, j = M - 1 +2. If 1 is present, decrement j i.e, move towards the left column. + * Whenever j is decremented, it means that row has more 1s, so we can update our answer to that particular row number +4. If 0 is present, then we want to check in next row that if 1 is present, so we increment i + + + +#### Pseudocode +```cpp +i = 0, j = N - 1 + +while (i < N && j >= 0) { + while (j >= 0 && arr[i][j] == 1) { + j--; + ans = i; + } + i++; +} +return ans; + +``` + +#### Complexity +**Time Complexity:** O(M + N) since at every step, we are either discarding a row or a column. Since total rows+columns are N+M, hence Iterations will be N+M. +**Space Complexity:** O(1) + + + +--- +### Problem 3 Print Boundary Elements + + +Given an matrix of N X N i.e. Mat[N][N], print boundary elements in clockwise direction. + +**Example:** +```cpp +N = 5 +``` + + +**Output:** [1, 2, 3, 4, 5, 10, 15, 20, 25, 24, 23, 22, 21, 16, 11, 6] + + +--- +### Question +Given N and matrix mat, select the correct order of boundary elements traversed in clockwise direction. +```cpp +N = 3 +``` +mat :- +| 1 | 2 | 3 | +|:---:|:---:|:---:| +| **4** | **5** | **6** | +| **7** | **8** | **9** | + + +**Choices** +- [x] [1, 2, 3, 6, 9, 8, 7, 4] +- [ ] [1, 4, 7, 8, 9, 6, 3, 2] +- [ ] [1, 2, 3, 4, 5, 6, 7, 8] +- [ ] [2, 3, 4, 5, 6, 7, 8, 9] + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach +* Print N - 1 elements of first row from left to right +* Print N - 1 elements of last column from top to bottom +* Print N - 1 elements of last row from right to left +* Print N - 1 elements of first column from bottom to top + +#### Pseudocode + +```cpp +function printBoundaryElements(Mat[][], N) { + i = 0 j = 0 + + // Print N - 1 elements of first row from left to right + + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + j++ + } + + // Print N - 1 elements of last column from top to bottom + // i and j will already be 0 and 4 respectively after above loop ends + + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + i++ + } + + // Print N - 1 elements of last row from right to left + // i and j will already be 4 and 4 respectively after above loop ends + + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + j-- + } + + // Print N - 1 elements of first column from bottom to top + // i and j will already be 4 and 0 respectively after above loop ends + + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + i-- + } +} +``` +#### Complexity +**Time Complexity : O(N)** +**Space Complexity : O(1)** + +--- +### Problem 4 Spiral Matrix + + +Given an matrix of N X N i.e. Mat[N][N]. Print elements in spiral order in clockwise direction. + +**Example** + +```cpp +N = 5 +``` + + +Here is the depiction to understand the problem better + + + +```cpp +Solution = [1,2,3,4,5,6,12,18,24,30,36,35,34,33,32,31,25,19,13,7,8,9,10,11,17,23,29,28,27,26,20,14,15,16,22,21] +``` + +The red arrow represents direction of traversal(clockwise) and fashion in which elements are traversed. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Approach +* We can break the problem into several boundary printing problem discussed above +* So first print boundary of matrix of N x N +* Then we print boundary of next submatrix with top left element being (1,1) and Bottom right element being (N - 2 , N - 2). +* After every boundary, to print the next boundary, N will be reduced by 2 and i & j will be incremented by 1. +* We do this till matrix of size least size is reached. + + + + +Boundaries of submatricies are highlighted in different color. + +#### Edge Case +Will the above code work if matrix size is 1 ? +No, since the loops run N-1 times, therefore we have to handle it separately. + +--- +### Question +Print elements in spiral order in clockwise direction. + +|**13**|**14**|**12**|**8**| +|-----|-----|-----|-----| +|**9**|**1**|**2**|**7**| +|**0**|**4**|**3**|**0**| +|**10**|**5**|**6**|**11**| + + +**Choices** +- [ ] [13, 9, 0, 10, 5, 6, 11, 0, 7, 8, 12, 14, 1, 4, 2, 3] +- [ ] [13, 14, 12, 8, 9, 1, 2, 7, 0, 4, 3, 0, 10, 5, 6, 11] +- [x] [13, 14, 12, 8, 7, 0, 11, 6, 5, 10, 0, 9, 1, 2, 3, 4] +- [ ] [13, 14, 12, 8, 10, 5, 6, 11, 9, 1, 2, 7, 0, 4, 3, 0] + + +#### Pseudocode + +```cpp +Function printBoundaryElements(Mat[][], N) { + i = 0 j = 0 + while (N > 1) { + + // Print N-1 elements of first row from left to right + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + j++ + } + + // Print N-1 elements of last column from top to bottom + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + i++ + } + + // Print N-1 elements of last row from right to left + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + j-- + } + + // Print N-1 elements of first column from bottom to top + for (idx = 1; idx < N; idx++) { + print(Mat[i][j] + ",") + i-- + } + + N = N - 2 + i++ + j++ + } + + if (N == 1) { + print(Mat[i][j] + ",") + } +} + +``` +#### Complexity +**Time Complexity : $O(N^2)$** +**Space Complexity : O(1)** + +--- +## What is a submatrices and how can we uniquely identify it + + +### What is a submatrix? + +Same as how a subarray is continuous part of an Array, a submatrix is continuous sub-matrix of a matrix. + +Example, + + +| 11 | 12 | +|:------:|:------:| +| **15** | **16** | + +is submatrix of the below matrix. + + + + +### How can we uniquely indentify a rectangle ? + +A rectangle is made up of 4 coordinates. +1. Top Left (TL) +2. Top Right (TR) +3. Bottom Left (BL) +4. Bottom Right (BR) + +**If we pick any two diagonal coordinates, we can uniquely identify a rectangle.** + + + +So, let's say we pick TL and BR. + +**Example -** + +If TL = (3,2) and BR = (2,3) +Then we know which rectangle we are talking about(shown below). + + + +So, with the help of TL and BR coordinates(or TR & BL), we can uniquely identify a submatrices. + +--- +### Problem 5 Sum of all Submatrices Sum + + +Given a matrix of N rows and M columns determine the sum of all the possible submatrices. + +**Example:** + + + +All Possible sub-matrices are - + + +Total Sum = 166 + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach + +This question sounds same as "Sum of all Subarray Sums". We did that question is Intermediate - Subarrays. The technique used was Contribution Technique, where for every element we had to find that in how many subarrays it was part of. + +In "Sum of all Submatrices Sums", we have to find that in how many submatrices a particular element is part of. + +If we are able to find that, then we just have to add up the individual results. + +#### In what all submatrices, a particular element is part of ? + +Let's look at the red cell in below figure. +If we combine all the top left cells(marked with green color) with all the bottom right cells(marked with blue color), then in all those submatrices, the red cell will be present. + + + +#### How to find the number of TL cells and BR cells in which (i,j) is part of. + + + +**TOP LEFT:** +rows: [0 i] +cols: [0 j] +total cells = (i+1) * (j+1) + +**BOTTOM RIGHT:** +rows: [i N-1] +cols: [j M-1] +total cells = (N-i) * (M-j) + +#### Now, to find the total submatrices of whish (i,j) is part of - + +**contribution of (i,j) = TOP LEFT * BOTTOM RIGHT** +Every top left cell can be combined with every bottom right cell. + +**Example** + + + +For (2,2) + +TOP LEFT: +3 * 3 = 9 + +BOTTOM RIGHT +(5-2) * (6-2) = 3 * 4 = 12 + +Total matrices of which (2,2) is part of 9 * 12. + +--- +### Question + + +In a matrix of size 4 * 5, in how many submatrices (1,2) is part of ? + +**Choices** +- [ ] 56 +- [x] 54 +- [ ] 15 +- [ ] 16 + +#### Pseudocode + +```cpp +total = 0 +for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + + top_left = (i + 1) * (j + 1); + bottom_right = (N - i) * (M - j); + + contribution = A[i][j] * top_left * bottom_right; + + total += contribution + } +} +return total +``` \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Arrays 3 Interview Problems.md b/Academy DSA Typed Notes/Advanced/DSA Arrays 3 Interview Problems.md new file mode 100644 index 0000000..42af631 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Arrays 3 Interview Problems.md @@ -0,0 +1,456 @@ +# Lecture | Advanced DSA: Arrays 3 - Interview Problems + +--- +## Merge Intervals + +An Interval is defined by start and end time, where start <= end. + +Say we are given a list of Intervals, we will have to merge them if they overlap. + +Let's look at them below - + + + +### Non-Overlapping Condition + +Say there are two Intervals, I1 {s1 e1} & I2 {s2 e2} +Then the condition for them to not overlap is - + + + + +```javascript +if(s2 > e1 || s1 > e2) +``` + +So, if above condition is not followed, it says that Intervals are overlapping! + + +### How to merge overlapping Intervals ? + + +**[I1.start , I1.end] & [I2.start , I2.end]** +After merging - +**[min(I1.start, I2.start) , max(I1.end, I2.end)]** + +--- +### Question +If the intervals [3, 8] and [5, 12] are given, do they overlap? + +**Choices** +- [x] Yes +- [ ] No + + +### Explanation: + +Answer: Yes + +The intervals [3, 8] and [5, 12] overlap because 8 is greater than 5. The overlapping area is [5, 8] + +--- +### Question +What is the correct way to represent the merged result of intervals [6, 10] and [8, 15]? + +**Choices** +- [x] [6, 15] +- [ ] [6, 8, 10, 15] +- [ ] [6, 10] and [8, 15] +- [ ] [8, 10] + +### Explanation: + +[6, 15] + +This is because the merging of intervals involves combining overlapping intervals into a single, continuous interval + + +--- +### Problem 1 : Merge sorted Overlapping Intervals + +**Problem Statement** +Given a sorted list of overlapping intervals, sorted based on start time, merge all overlapping intervals and return sorted list. + +**Input:** +Interval[] = {(0,2), (1,4), (5,6), (6,8), (7,10), (8,9), (12,14)} + +**Output:** + +{(0,4), (5,10), (12,14)} + +#### Explanation: + + +| Interval 1 | Interval 2 | | Answer Interval List | +|:----------:|:----------:|:---------------:|:--------------------:| +| 0-2 | 1-4 | Overlapping | 0-4 | +| 0-4 | 5-6 | Not Overlapping | 0-4, 5-6 | +| 5-6 | 6-8 | Overlapping | 0-4, 5-8 | +| 5-8 | 7-10 | Overlapping | 0-4, 5-10 | +| 5-10 | 8-9 | Overlapping | 0-4, 5-10 | +| 5-10 | 12-14 | Not Overlapping | 0-4, 5-10, 12-14 | + + +#### The Array Is Sorted Based on Start Time. What Is the Overlapping Condition? +Say start time of A < start time of B + + + +Overlapping Condition - +**If start of B <= end of A** + + +--- +### Question +Given a sorted list of overlapping intervals, sorted based on start time, merge all overlapping intervals and return sorted list. + +**Input:** +Interval[] = { (1,10), (2, 3), (4, 5), (9, 12)} + +**Choices** +- [x] (1, 12) +- [ ] (1, 10), (9, 12) +- [ ] (1, 9), (9, 12) +- [ ] No Change + + +#### Problem 1 Approach + +* Create an array to store the merged intervals. +* If the current and ith intervals overlaps, merge them. In this case update the current interval with the merged interval. +* Else, insert the current interval to answer array since it doesn't overlap with any other interval and update the current Interval to ith Interval. + +#### Dry Run + +**Input:** +Interval[] = {(0,2), (1,4), (5,6), (6,8), (7,10), (8,9), (12,14)} + +#### Explanation: + + +| current | ith | | After merging | answer list | +|:-------:|:-----:|:---------------:|:-------------:|:-----------:| +| 0-2 | 1-4 | Overlapping | 0-4 | | +| 0-4 | 5-6 | Not Overlapping | Not needed | 0-4 | +| 5-6 | 6-8 | Overlapping | 5-8 | 0-4 | +| 5-8 | 7-10 | Overlapping | 5-10 | 0-4 | +| 5-10 | 8-9 | Overlapping | 5-10 | 0-4 | +| 5-10 | 12-14 | Not Overlapping | Not needed | 0-4, 5-10 | +| 12-14 | end | | | | + +At the end, we are left with the last interval, so add it to the list. + +#### Pseudocode +```cpp +//Already a class/structure will be present for Interval +//We will only need to create an answer array of type Interval + +list < Interval > ans; + +// Current Segment +int cur_start = A[0].start, cur_end = A[0].end; + +for (int i = 1; i < A.size(); i++) { + + // if i'th interval overlaps with current interval + if (A[i].start <= cur_end) { + // merging them + cur_end = max(cur_end, A[i].end); + } else { + //adding current interval to answer. + //create a new Interval + Interval temp(cur_start, cur_end); //if struct is declared, otherwise if class is declared then we can simply use new keyword + ans.push_back(temp); + + // update cur Interval to ith + cur_start = A[i].start; + cur_end = A[i].end; + } +} +Interval temp(cur_start, cur_end); +ans.push_back(temp); +return ans; +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + +--- +### Problem 2 Sorted Set of Non Overlapping Intervals + +Given a sorted list of overlapping intervals based on start time, insert a new interval such that the final list of intervals is also sorted and non-overlapping. +Print the Intervals. + +**Example 1:** +**N = 9** +(1,3) +(4,7) +(10,14) +(16,19) +(21,24) +(27,30) +(32,35) +(38,41) +(43,50) + +New Interval +**(12, 22)** + +**Explanation:** + +| ith | new Interval | Overlaps? | Print | +|-------|----------|----------|-----------------| +| (1,3) | (12,22) | No | (1,3) | +| (4,7) | (12,22) | No | (4,7) | +| (10,14) | (12,22) | Yes; merged: (10,22) || +| (16,19) | (10,22) | Yes; merged: (10,22) || +| (21,24) | (10,22) | Yes; merged: (10,24) || +| (27,30) | (10,22) | No; small new Interval gets printed first |(10,22)| +| (32,35)| | |(32,35)| +| (38,41)| | |(38,41) | +| (43,50)| | | (43,50)| + +**Please Note:** Once the new Interval gets printed, all the Intervals following it also gets printed. + +**More Examples** + +**Example 2:** +**N = 5** +(1,5) +(8,10) +(11,14) +(15,20) +(21,24) + +New Interval +**(12, 24)** + +| ith | new Interval | Overlaps? | Print | +|:-------:|:------------:|:--------------------:|:------:| +| (1,5) | (12, 24) | No | (1,5) | +| (8,10) | (12, 24) | No | (8,10) | +| (11,14) | (12, 24) | Yes; merged:(11, 24) | | +| (15,20) | (11, 24) | Yes; merged:(11, 24) | | +| (21,24) | (11, 24) | Yes; merged:(11, 24) | | + +We are done with all the intervals but left the new Interval at the end; in this case we have to print the new Interval. + +**Example 3:** + + + + +--- +### Question +If the sorted set of non-overlapping intervals is [1, 5], [6, 10], and [12, 15], what happens if you add the interval `[4, 7]` such that the final list of intervals is also sorted and non-overlapping.? + +**Choices** +- [x] [1, 10] and [12, 15] +- [ ] [1, 5], [4, 7], [6, 10], [12, 15] +- [ ] [1, 5] and [6, 10] only +- [ ] No change + + +#### Explanation: +(1,5) +(6,10) +(12,15) + +New Interval +**(4, 7)** + +| ith | new Interval | Overlaps? | Print | +|:-------:|:------------:|:--------------------:|:------:| +| (1,5) | (4, 7) | Yes; merged:(1, 7) | | +| (6,10) | (1, 7) | Yes; merged:(1, 10) | | +| (12,15) | (1, 10) | No; small new Interval gets printed first | (1, 10) | +| (12,15) | | | (12, 15) | + +Thus after merging, the intervals are [1, 10] and [12, 15] + +#### Problem 2 Pseudocode + +```cpp + +void merge(int Interval[], int nS, int nE) { + for (int i = 0; i < N; i++) { + int L = Interval[i].start, R = Interval[i].end; + + //Not Overlapping + if (nS > R) { + print({ + L, + R + }); + } + // new Interval is not overlapping and is smaller + // print new Interval and then all the remaining Intervals + else if (L > nE) { + print({ + nS, + nE + }); + + for (int j = i; j < N; j++) { + print({ + Interval[j].start, + Interval[j].end + }) + } + return; + } else { + nS = min(L, nS); + nE = max(R, nE); + } + } + print({ + nS, + nE + }); +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + +--- +### Problem 3 Find First Missing Natural Number + +Given an unsorted array of integers, Find first missing Natural Number. + +**Examples** + + + +--- +### Question +In the array [5, 3, 1, -1, -2, -4, 7, 2], what is the first missing natural number? + +**Choices** +- [x] 4 +- [ ] 6 +- [ ] -3 +- [ ] 8 + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +--- +### Find First Missing Natural Number Solution Approach +#### Approach 1: Brute Force +Check for all the numbers from 1 till we get the answer +**T.C -** O(N * ans) + +Here, in the worst case answer can go uptil N+1, in case if all numbers from 1 to N are present in the array. + +**Example -** {4, 1, 3, 2} +Here we will have to iterate till 5, ie. N+1. + +#### Idea +**Can we utilise the fact that answer can be out of 1 to N+1?** +If any number other than 1 to N is present, then missing is out of 1 to N only. +If all elements from 1 to N are present, then it will be N+1. + +Say we start checking if 1 is present or not, we somehow want to mark the presence of 1. +Now, since we can't use extra space, so we can use indices to mark the presence of a number. + +Index 0 can be used to mark presence of 1. +Index 1 can be used to mark presence of 2. +Index 2 can be used to mark presence of 3. +so on.... + +**Now how do we mark the presence ?** + +**One Solution:** +```plaintext +We can set element at that index as negative. +``` + +*But what if negative number is part of the input?* + +**Let's assume only positive numbers are present** +We can use indices to mark the presence of a number. +We can set element at that index as negative. + +**A[ ] = {8, 1, 4, 2, 6, 3}** + +```plaintext +N = 6 +Answer can be from [1 7] +So, if any number is beyond this range, we don't care! +``` + +| index | element | presence marked at index | state of the array | +|:-----:|:-------:|:-------------------------------------:|:-----------------------:| +| 0 | 8 | don't care, since out of answer range | | +| 1 | 1 | 0 | {-8, 1, 4, 2, 6, 3} | +| 2 | 4 | 3 | {-8, 1, 4, -2, 6, 3} | +| 3 | 2 | 1 | {-8, -1, 4, -2, 6, 3} | +| 4 | 6 | 5 | {-8, -1, 4, -2, 6, -3} | +| 5 | 3 | 2 | {-8, -1, -4, -2, 6, -3} | + +Now, we can just iterate from left to right and whichever element is not ve-, we can return i+1 as the answer. +**Example: {-8, -1, -4, -2, 6, -3}** +Here, index: 4 is +ve, hence 5 is the answer. + +**NOTE:** Since we are marking elements as negative, so when checking presence of a certain number, we'll have to consider the absolute value of it. + +#### Pseudocode +```cpp +for (int i = 0; i < N; i++) { + int ele = abs(A[i]); + + if (ele >= 1 && ele <= N) { + int idx = ele - 1; + A[idx] = -1 * abs(A[i]); + } +} +``` + +--- +### Find First Missing Natural Number For Negative Numbers +#### How to resolve for negative numbers ? + +Will negatives ever be our answer? +**NO!** +So, we don't have to care about them! + +Should we change them to ve+ ? +**NO!** They may fall in our answer range. + +Should we mark them 0? +**NO!** Then we will not be able to mark the presence of a number! + +***We can just change negative number to a number that is out of our answer range. **It can be N+2**.*** + +```cpp +for (int i = 0; i < N; i++) { + if (A[i] <= 0) { + A[i] = N + 2; + } +} + +for (int i = 0; i < N; i++) { + int ele = abs(A[i]); + + if (ele >= 1 && ele <= N) { + int idx = ele - 1; + A[idx] = -1 * abs(A[i]); + } +} + +for (int i = 0; i < N; i++) { + if (A[i] > 0) return i + 1; +} +return N + 1; +``` +>Please show a dry run on - {4, 0, 1, -5, -10, 8, 2, 6} + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + diff --git a/Academy DSA Typed Notes/Advanced/DSA Backtracking.md b/Academy DSA Typed Notes/Advanced/DSA Backtracking.md new file mode 100644 index 0000000..1c234ba --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Backtracking.md @@ -0,0 +1,482 @@ +# Backtracking + +--- +### Question +What is the output of below code for N = 7 ? +``` +int magicfun( int N) { + if ( N == 0) + return 0; + else + return magicfun(N/2) * 10 + (N % 2); +} +``` + +**Choices** + +- [ ] 100 +- [x] 111 +- [ ] 99 +- [ ] 112 + +**Explanation** +```cpp + magicfun(7) + + magicfun(3) * 10 + 1 + + magicfun(1) * 10 + 1 + + magicfun(0) * 10 + 1 + + 0 +``` + + +--- +### Question + +Time complexity of below code is? +``` +int magicfun( int N) { + if ( N == 0) + return 0; + else + return magicfun(N/2) * 10 + (N % 2); +} +``` + +**Choices** + +- [x] O(log N) +- [ ] O(1) +- [ ] O(N) +- [ ] O(N/2) + + +Everytime we are dividing N by 2. Hence complexity will be log N. + +--- +### Question + +Output of below code is? +``` +void fun(char s[], int x) { + print(s) + char temp + if(x < s.length/2) { + temp=s[x] + s[x] = s[s.length-x-1] + s[s.length-x-1]=temp + fun(s, x+1) + } +} +``` + +Run for fun("SCROLL", 0) + +**Choices** + +- [ ] SCROLL + SCROLL + SCROLL + SCROLL +- [x] SCROLL + LCROLS + LLROCS + LLORCS +- [ ] LLORCS + SCROLL + LCROLS + LLROCS + + +We start with +(SCROLL, 0); line 2 runs; print => SCROLL +since 0 < 6/2, we run the if block and index 0 gets swapped with 5 + +(LCROLS, 1); line 2 runs; print => LCROLS +since 1 < 6/2, we run the if block and index 1 gets swapped with 4 + +(LLROCS, 2); line 2 runs; print => LLROCS +since 2 < 6/2, we run the if block and index 2 gets swapped with 3 + +(LLORCS, 3); line 2 runs; print => LLORCS +since 3 not less than 6/2, we skip if block and come back from recursion + +--- +### Question + +Time Complexity of below code is? +``` +void fun(char s[], int x) { + print(s) + char temp + if(x < s.length/2) { + temp=s[x] + s[x] = s[s.length-x-1] + s[s.length-x-1]=temp + fun(s, x+1) + } +} +``` + +**Choices** + +- [ ] O(N^2) +- [ ] O(1) +- [x] O(N) +- [ ] O(N/2) + + + +We are only iterating till half of the string. In the worst case, we can start at 0th index. + +Therefore, #iterations = N/2 +Hence, T.C = O(N) +S.C is also O(N) since call will be made for half of the string. + +--- +## What is Backtracking + + +The above process is known as **Backtracking**. + +Let's try to understand the concept of backtracking by a very basic example. We are given a set of words represented in the form of a tree. The tree is formed such that every branch ends in a word. + + + +Our task is to find out if a given word is present in the tree. Let's say we have to search for the word **AIM**. A very brute way would be to go down all the paths, find out the word corresponding to a branch and compare it with what you are searching for. You will keep doing this unless you have found out the word you were looking for. + + + +In the diagram above our brute approach made us go down the path for ANT and AND before it finally found the right branch for the word AIM. + +The backtracking way of solving this problem would stop going down a path when the path doesn't seem right. When we say the path doesn't seem right we mean we come across a node which will never lead to the right result. As we come across such node we back-track. That is go back to the previous node and take the next step. + + + +In the above diagram backtracking didn't make us go down the path from node N. This is because there is a mismatch we found early on and we decided to go back to the next step instead. Backtracking reduced the number of steps taken to reach the final result. This is known as pruning the recursion tree because we don't take unnecessary paths. + +--- +### Problem 1 : Print Valid Parenthesis Continued +#### Explanation + +As shown in the picture below: ) is an invalid string, so every string prefixed with it is also invalid, and we can just drop it. + + + +To ensure that the current string is always valid during the backtracking process, we need two variables `left_count` and `right_count` that record the number of left and right parentheses in it, respectively. + +Therefore, we can define our recursive function as `solve(cur_string, left_count, right_count)` that takes the current string, the number of left parentheses, and the number of right parentheses as arguments. This function will build valid combinations of parentheses of length 2n recursively. + +The function adds more parentheses to cur_string only when certain conditions are met: + +* If **`left_count < n`**, it suggests that a left parenthesis can still be added, so we add one left parenthesis to cur_string, creating a new string new_string = cur_string + (, and then call `solve(new_string, left_count + 1, right_count)`. + +* If **`left_count > right_count`**, it suggests that a right parenthesis can be added to match a previous unmatched left parenthesis, so we add one right parenthesis to cur_string, creating a new string new_string = cur_string + ), and then call solve(new_string, left_count, right_count + 1). + +This function ensures that the generated string of length 2n is valid, and adds it directly to the answer. By only generating valid strings, we can avoid wasting time checking invalid strings. + + +#### Dry Run for N = 2, means overall length will be 4. + + + +- Here **"(())" and "()()"** are valid answers. + +#### PseudoCode +```cpp +void solve(str, N, opening, closing) { //also taking given N value in parameter + // base case + if (str.length() == 2 N) { + print(str); + return; + } + if (opening < N) { + solve(N, str + '(', opening + 1, closing) + } + if (closing < opening) { + solve(N, str + ')', opening, closing + 1) + } +} +``` + +#### Complexity +- **Time Complexity:** O(2N) +- **Space Complexity:** O(N) + +--- +### Definition of Subset and Subsequences + + +#### Definition of Subset and Example +A subset is often confused with subarray and subsequence but a subset is nothing but any possible combination of the original array (or a set). + +For example, the subsets of array arr = [1, 2, 3, 4, 5] can be: + +[3, 1] +[2, 5] +[1, 2], etc. +So, we can conclude that subset is the superset of subarrays i.e. all the subarrays are subsets but vice versa is not true. + +#### Definition of Subsequence and Example +As the name suggests, a subsequence is a sequence of the elements of the array obtained by deleting some elements of the array. One important thing related to the subsequence is that even after deleting some elements, the sequence of the array elements is not changed. Both the string and arrays can have subsequences. + +The subsequence should not be confused with the subarray or substring. The subarray or substring is contiguous but a subsequence need not to be contiguous. + +For example, the subsequences of the array arr : [1, 2, 3, 4] can be: + +[1, 3] +[2, 3, 4] +[1, 2, 3, 4], etc. + +Note: A subarray is a subsequence, a subsequence is a subset but the reverse order is not correct. + +--- +### Problem 2 Subsets + +Given an array with distinct integers. Print all the subsets using recursion. + +**Example** + +**Input:** [1, 2, 3] +**Output:** {[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]} + +Total Subsets possible are **2^N** +For every element, there can be two options: +- It is **considered** as part of a subset +- It is **not considered** as part of a subset + +Say there are **3 elements**, for each of them we have above two options, hence **2 * 2 * 2 = 2^N^** are the total options. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Approach + +The approach to solve the problem is to use backtracking. + +For each element, I have two choices whether to keep it or not, I execute my choice and then ask recursion to do the remaining work. + +Let us take an example of `[1, 2, 3]`. + + + + +#### Psuedocode + +```cpp +list < list < int >> ans; +void subsets(list < int > A, list < int > currset, int idx) { + + //base case + if (idx == A.size()) { + ans.add(currset); + return; + } + + //for every ele in A, we have 2 choices + + //choice 1 : keep it in currset + currset.add(A[idx]); + subsets(A, currset, idx + 1); + + //choice 2 : Don't keep it in currset + currset.remove_back(); + subsets(A, currset, idx + 1); +} +``` + +NOTE: For producing individual sorted subsets, we need to sort the given array first. We will get the desired result with this since elements are being processed in sequence. + +#### Dry Run +A = {2, 6, 9} + + + +Continued + + + +#### Complexity +- **Time Complexity:** O(2^N^) +- **Space Complexity:** O(N) + +--- +### Question +What is the count of total permutations of a string with unique characters? (N=String length) + +**Choices** + +- [ ] N$^2$ +- [ ] N + (N + 1) / 2 +- [ ] N * (N - 1) / 2 +- [x] N! + +--- +### Problem 3 : Permutation + +Given a character array with distinct elements. Print all permutations of it without modifying it. + +**Example** +For string **abc**, of length 3, we have total 3! = 6 permutations: +- abc +- acb +- bac +- bca +- cab +- cba + +**Input:** abc +**Output:** abc acb bac bca cab cba + + +**Constraint** +We don't have duplicate characters in a string. + +--- +## Permutations Idea + +- Every permutation has n number of characters, where n is the length of the original string. +- So initially we have n number of empty spots. +`_ _ _` +- And we need to fill these empty spots one by one. +- Let us start with the first empty spot, which means from the 0th index. +- For the 0th index we have three options, `a, b, and c`, any of the three characters can occupy this position. + + + +- If `a` will occupy 0th index, then we have `a _ _`, and if `b` will occupy 0th index, then we have `b _ _`, and if `c` will occupy 0th index, then we have `c _ _`, + + + +- Now the first spot is occupied, now we have to think about the second spot. +- Now for a second spot we have only options left. + + + +- Now when the character occupies the second spot, then we get. + + + +- Now for the last spot, every string has left with a single character, like in `a b _`, we are only left with the character `c`. + + + + +- Now this character will occupy the last spot. + + + + +We are setting characters at positions one by one. So **We need to keep track of visited/used characters.** + +--- +### Permutations PsuedoCode + +```cpp +void permutations1(char[] arr, idx, ans[N], visited[N]) { + if (idx == arr.length) { + print(ans[]) + return + } + for (i = 0; i < N; i++) { // All possibilities + if (visited[i] == false) { // valid possibilities + visited[i] = true; + ans[idx] = arr[i]; + permutations1(arr, idx + 1, ans, visited); // recursive call for next index + visited[i] = false; //undo changes + } + } +} +``` + +### Permutations - Dry Run +Let us suppose we have the string `arr[] = a b c` , and initially ans array is empty, `ans[] = _ _ _`. + + + + +- Initially, we are at index 0, + + + +- Now i vary from 0 to `n-1`, so it will go from 0 to 2, as here the length of the string is 3. + + + +- Now when `i = 0`, we will check that `visited[i] == false`, so this condition is true, we mark `visited[i] == true` and `ans[0] = arr[0] = a`. + + + +- Now it makes a recursive call for the next index, `permutations1(arr, 1, ans, visited)` + + + +- Inside this call, `idx != arr.length`, so we will continue further, now inside this call, the loop will go from 0 to 2. + + + +- But in case `i = 0`, now `visited[0] != false`, so in this iteration we will not enter inside the if condition, i will simply get incremented. + + +- Now `i = 1`, we will check that `visited[i] == false`, so this condition is true, we mark `visited[1] == true` and `ans[1] = arr[1] = b`. + + + +- Now it will make recussive call for `idx + 1`, `permutations1(arr, 2, ans, visited)` + + + +- Now inside this new recursive again loop will run from 0 to 2. + + + +- Now when `i = 0`, now `visited[0] != false`, so in this iteration, we will not enter inside the if condition, i will simply get incremented. +- Now `i = 1`, again `visited[1] != false`, so in this iteration, we will not enter inside the if condition, i will simply get incremented. + + + +- Now `i = 2`, we will check that `visited[i] == false`, so this condition is true, we mark `visited[2] == true` and `ans[2] = arr[2] = c`. + + + +- Now it will make recussive call for `idx + 1`, `permutations1(arr, 3, ans, visited)` + + + +- Inside this call, our `idx == arr.length`, so print `ans`, so **abc will be printed**, and it will return. And after returning `visited[2] = false`. + + + + + + + +- Now for `arr, 2, ans, visited`, all iterations are completed. So it will also return and `visited[1] = false` + + + + + + +- Now for `arr, 1, ans, visited`, we are left for the iteration `i = 2`, so it will check for `visited[i] == false`, as `visited[2] = false`, so go inside the if condition and `visited[2] == true` and `ans[1] = arr[2] = c` + + + +- Now it will make the recursive call for `arr, 2, ans, visited`. And inside this call again loop will run from 0 to 2. Now `visited[0] == true`, so it will for `i = 1`, and so it will check for `visited[i] == false`, as `visited[1] = false`, so go inside the if condition and `visited[1] == true` and `ans[2] = arr[1] = b` + + + + +- Now it will make recussive call for `idx + 1`, `permutations1(arr, 3, ans, visited)` + + + +- Now inside this call `idx == arr.length`, so it will print `ans`, so **acb will be printed**, and it will return. + +In this way, all the permutations will be printed. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Bit Manipulation 1.md b/Academy DSA Typed Notes/Advanced/DSA Bit Manipulation 1.md new file mode 100644 index 0000000..b9bddbc --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Bit Manipulation 1.md @@ -0,0 +1,455 @@ +# Bit Manipulation 1 + +## Truth Table for Bitwise Operators + + +Below is the truth table for bitwise operators. + + +## Basic AND XOR OR Properties + +### Basic AND Properties +1. **Even/Odd Number** +In binary representation, if a number is even, then its least significant bit (LSB) is 0. +Conversely, if a number is odd, then its LSB is 1. + + * **A & 1 = 1** (if A is odd) + ```cpp + 181 = 10110101 //181 is odd, therefore LSB is 1 + + 10110101 & 1 = 1 // Performing Bitwise AND Operation + + Since, 181 is odd, Bitwise AND with 1 gave 1. + ``` + * **A & 1 = 0** (if A is even) + ```cpp + 180 = 10110100 //180 is even, therefore LSB is 0 + + 10110100 & 1 = 0 // Performing Bitwise AND Operation + + Since, 180 is even, Bitwise AND with 1 gave 0. + ``` +2. **A & 0 = 0** (for all values of A) +3. **A & A = A** (for all values of A) + +### Basic OR Properties +1. **A | 0 = A** (for all values of A) +2. **A | A = A** (for all values of A) + +### Basic XOR Properties +1. **A ^ 0 = A** (for all values of A) +2. **A ^ A = 0** (for all values of A) + +### Commutative Property +The order of the operands does not affect the result of a bitwise operation. + +```cpp +A & B = B & A // Bitwise AND +A | B = B | A // Bitwise OR +A ^ B = B ^ A // Bitwise XOR +``` + +### Associative Property +* It states that the grouping of operands does not affect the result of the operation. +* In other words, if we have three or more operands that we want to combine using a bitwise operation, we can group them in any way we want, and the final result will be the same. + +```cpp +(A & B) & C = A & (B & C) // Bitwise AND +(A | B) | C = A | (B | C) // Bitwise OR +(A ^ B) ^ C = A ^ (B ^ C) // Bitwise XOR +``` + +--- +### Question + +Evaluate the expression: a ^ b ^ a ^ d ^ b + +**Choices** + +- [ ] a ^ b ^ a ^ b +- [ ] b +- [ ] b ^ d +- [x] d + + +We can evaluate the expression as follows: +```cpp +a ^ b ^ a ^ d ^ b = (a ^ a) ^ (b ^ b) ^ d // grouping the a's and the b's += 0 ^ 0 ^ d // since a ^ a and b ^ b are both 0 += d // the result is d +``` +Therefore, the expression a ^ b ^ a ^ d ^ b simplifies to d. + +### Question + +Evaluate the expression: 1 ^ 3 ^ 5 ^ 3 ^ 2 ^ 1 ^ 5 + +**Choices** + +- [ ] 5 +- [ ] 3 +- [x] 2 +- [ ] 1 + + +We can evaluate the expression as follows: +```cpp +1 ^ 3 ^ 5 ^ 3 ^ 2 ^ 1 ^ 5 = ((1 ^ 1) ^ (3 ^ 3) ^ (5 ^ 5)) ^ 2 // grouping the pairs of equal values and XORing them += (0 ^ 0 ^ 0) ^ 2 // since x ^ x is always 0 += 0 ^ 2 // since 0 ^ y is always y += 2 // the result is 2 +``` +Therefore, the expression 1 ^ 3 ^ 5 ^ 3 ^ 2 ^ 1 ^ 5 simplifies to 2. + + +### Left Shift Operator (<<) +* The left shift operator (<<) shifts the bits of a number to the left by a specified number of positions. +* The left shift operator can be used to multiply a number by 2 raised to the power of the specified number of positions. + +Example: a = 10 +Let's see a dry run on smaller bit representation(say 8) +Binary Representation of 10 in 8 bits: 00001010 +```cpp +(a << 0) = 00001010 = 10 +(a << 1) = 00010100 = 20 (mutiplied by 2) +(a << 2) = 00101000 = 40 (mutiplied by 2) +(a << 3) = 01010000 = 80 (mutiplied by 2) +(a << 4) = 10100000 = 160 (mutiplied by 2) +(a << 5) = 01000000 = 64 (overflow, significant bit is lost) +``` + +In general, it can be formulated as: +```cpp +a << n = a * 2^n +1 << n = 2^n +``` +However, it's important to note that left shifting a number beyond the bit capacity of its data type can cause an **overflow** condition. + +In above case, if we shift the number 10 more than 4 positions to the left an overflow will occur. + + +```cpp +(a << 5) = 01000000 = 64 +//(incorrect ans due to overflow) +// correct was 320 but it is too large to get stored in 8 bits +``` + +**Note:** We can increase the number of bits, but after a certain point it will reach limit and overflow will occur. + + + +### Right Shift Operator (>>) +* The right shift operator (>>) shifts the bits of a number to the right by a specified number of positions. +* When we right shift a binary number, the most significant bit (the leftmost bit) is filled with 0. +* Right shift operator can also be used for division by powers of 2. + +Let’s take the example of the number 20, which is represented in binary as 00010100. Lets suppose, it can be represented just by 8 bits. +```cpp +(a >> 0) = 00010100 = 20 +(a >> 1) = 00001010 = 10 (divided by 2) +(a >> 2) = 00000101 = 5 (divided by 2) +(a >> 3) = 00000010 = 2 (divided by 2) +(a >> 4) = 00000001 = 1 (divided by 2) +(a >> 5) = 00000000 = 0 (divided by 2) +``` +In general, it can be formulated as: +```cpp +a >> n = a/2^n +1 >> n = 1/2^n +``` +Here, overflow condition doesn't arise. + + +### Question + +What will we get if we do 1 << 3 ? + +**Choices** + +- [ ] 1 +- [x] 8 +- [ ] 3 +- [ ] 4 + + +--- +### Power of Left Shift Operator + +### OR( | ) Operator +**Left Shift Operator** can be used with the **OR** operator to **SET** the **ith** bit in the number. + +``` +N = (N | (1<th** bit if it is UNSET else there is no change. + +**Example** + + + +### XOR( ^ ) Operator +**Left Shift Operator** can be used with the **XOR** operator to **FLIP(or TOGGLE)** the **ith** bit in the number. + +``` +N = (N ^ (1<th** bit is SET, then it will be UNSET or vice-versa. + +**Example** + + + +### AND( & ) Operator +**Left Shift Operator** can be used with **AND** operator to check whether the **ith** bit is set or not in the number. + +``` +X = (N & (1<th** bit is unset. Else the *i-th* bit is set. + +**Example** + + + +--- +### Problem 1 Check whether ith bit in **N** is SET or not + +Check whether the **ith** bit in **N** is SET or not. + + +#### Approach + +Taking **AND with 1** can help us. +0 & 1 = 0 +1 & 1 = 1 + +1. We can shift 1 to the ith bit. +2. If `X = (N & (1< 0, then **ith** bit is set. + * else **ith** bit is not set. + +**Example** +Suppose we have +``` +N = 45 +i = 2 +``` +The binary representation of 45 is: +``` +1 0 1 1 0 1 +``` +The binary representation of (1<<2) is: +``` +0 0 0 1 0 0 +``` + +45 & (1<<2) is +``` +0 0 0 1 0 0 +``` + +It is greater than 0. Hence **ith** bit is SET. + +#### Pseudocode +```cpp +function checkbit(int N, int i) { + if (N & (1 << i)) { + return true; + } else { + return false; + } +} +``` + +#### Complexity +**Time Complexity** - O(1). +**Space Complexity** - O(1). + +--- +### Problem 2 Count the total number of SET bits in N + + +Given an integer **N**, count the total number of SET bits in **N**. + +**Input** +``` +N = 12 +``` +**Output** +``` +2 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach 1 +Iterate over all the bits of integer(which is maximum 32) and check whether that bit is set or not. If it is set then increment the answer(initially 0). +```cpp +function countbit(int N) { + int ans = 0; + for (i = 0; i < 32; i++) { + if (checkbit(N, i)) { + ans = ans + 1; + } + } + return ans; +} +``` + +Here, checkbit function is used to check whether the **ith** bit is set or not. + +#### Approach 2 +To count the number of SET bits in a number, we can use a Right Shift operator as: + +* Initialize a count variable to zero. +* While the number is not equal to zero, do the following: + * Increment the count variable if the **0th** bit of the number is 1. + * Shift the number one bit to the right. + * Repeat steps a and b until the number becomes zero. +* Return the count variable. + +```cpp +function countbit(int N) { + int ans = 0; + while (N > 0) { + if (N & 1) { + ans = ans + 1; + } + N = (N >> 1); + } + return ans; +} +``` + +--- +### Question + +What is the time complexity to count the set bits ? + +**Choices** + +- [x] log N +- [ ] N +- [ ] N^2 +- [ ] 1 + + +**Explanation** +For both of the above approaches, +* **Time Complexity** - O(log2(N)) +Since N is being repeatedly divided by 2 till it is > 0. +* **Space Complexity** - O(1). + + +--- +### Problem 3 Unset the ith bit of the number N if it is set + +**UNSET** the **ith** bit of the number **N** if it is set. + +**Example** + +Suppose we have a number ```N = 6``` +Binary Representation of 6: +``` +1 1 0 0 +``` +We have to unset its 2nd bit + +``` +1 0 0 0 +``` + +#### Approach + +First of all, we can check if the bit is set or not by taking & with 1. + +``` +X = (N & (1< 0, it means the **ith** bit is SET. To UNSET that bit do: +`N = (N ^ (1< + + + +* We will iterate on all the bits one by one. +* We will count the numbers in the array for which the particular bit is set +* If the count is odd, in the required number that bit is set. + +#### Pseudocode +```cpp +int ans = 0; + +for (int i = 0; i < 32; i++) { // go to every bit one by one + int cnt = 0; + + for (int j = 0; j < arr.size(); j++) { // iterate on array + + // check if ith bit is set + if ((arr[j] & (1 << i)) cnt++; + } + + if (cnt & 1) // If the count is odd + ans = ans | 1 << i; // set ith bit in ans + } + + print(ans); +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + + + +--- +### Problem 2 Single number 2 + +Given an integer array, all the elements will occur thrice but one. Find the unique element. + +**Example** +**Input:** [4, 5, 5, 4, 1, 6, 6, 4, 5, 6] +**Output:** 1 + +`Only 1 occurs a single time` + +#### Approach 1: Brute Force +Using two for loops and counting the occurence of each number. + +#### Complexity +**Time Complexity:** O(N^2) +**Space Complexity:** O(1) + +#### Approach 2: Hashmaps +Iterate on array and store frequency of each number in Hashmap. +Iterate on array/map and return the number with frequency 1. + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +:::warning +Please take some time to think about the optimsed approach on your own before reading further..... +::: + +#### Approach 3: Best Approach +Hint can be taken from the previous question. + + + +* Iterate on every bit. +* If the count of numbers in which ith bit is set is a multiple of 3, then in answer ith bit is NOT SET. +* If the count of numbers in which ith bit is of the form (3 * x) + 1, then in answer ith bit is SET. + +#### Pseudocode +```cpp= +int ans = 0; + +for (int i = 0; i < 32; i++) { // go to every bit one by one + int cnt = 0; + + for (int j = 0; j < arr.size(); j++) { // iterate on array + + // check if ith bit is set + if ((arr[j] & (1 << i)) cnt++; + } + + if (cnt % 3 == 1) // If the count is not the multiple of 3 + ans = ans | 1 << i; // set ith bit in ans + } + + print(ans); +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + +--- +### Problem 3 Single number 3 + +Given an integer array, all the elements will occur twice except two. Find those two elements. + +**Input:** [4, 5, 4, 1, 6, 6, 5, 2] + +**Output:** 1, 2 + +#### Hint: +* Will finding XOR help ? May be! +* What do we get if we XOR all numbers ? XOR of the two unique numbers! +* From that can we identify/separate the two numbers ? Not Really! Why? + * Example: If XOR is 7, we aren't sure which 2 numbers are they. (2, 5), (1, 6), (3, 4), ... have xor = 7, so we won't be able to identify! + + +***Is there any way in which we can identify the two numbers from their XOR ?*** + +Suppose if two unique numbers are **a** and **b**. Their XOR is **c**. +In **c** if say 0th bit is set, what does that tell about a and b ? +In one of the numbers the bit is set and in other the bit is unset! So, can we identify the numbers based on that ? + +#### Idea: + +* We will find the position of any set bit in XOR c, it will denote that this bit is different in a and b. +* Now, we divide the entire array in two groups, based upon whether that particular bit is set or not. +* This way a and b will fall into different groups. +* Now since every number repeats twice, they will cancel out when we take XOR of the two groups individually leaving a and b. + + +#### Pseudocode +```cpp +int xorAll = 0; + +// XOR of all numbers in the array +for (int i = 0; i < N; i++) { + xorAll ^= A[i]; +} + +// Find the rightmost set bit position +// Note: Any other bit can be used as well +int pos; + +for (pos = 0; pos < 32; pos++) { + if (checkbit(xorAll, pos)) + break; +} + +num1 = 0; +num2 = 0; + +// Divide the array into two groups based on the rightmost set bit +for (int i = 0; i < N; i++) { + if (checkbit(A[i], pos)) { + num1 ^= A[i]; + } else { + num2 ^= A[i]; + } +} + +print(num1); +print(num2); +``` + +--- +### Question +What is the time complexity to find two unique elements where every element is present 2 times except for two unique elements? + +**Choices** +- [ ] O(1) +- [ ] O(log(N)) +- [x] O(N) +- [ ] O(32 * N) + +--- +### Problem 4 Maximum AND pair + +Given N array elements, choose two indices(i, j) such that **(i != j)** and **(arr[i] & arr[j])** is maximum. + +**Input:** [5, 4, 6, 8, 5] + +**Output:** [0, 4] + +If we take the **&** of 5 with 5, we get 5 which is the maximum possible value here. The required answer would be their respective indices i.e. **0,4** + +--- +### Question +Max & Pair in this array (arr[] = 21,18,24,17,16) is + +**Choices** +- [x] 21&17 +- [ ] 24&21 +- [ ] 17&16 +- [ ] 24&18 + +--- +### Question +Max & Pair in this array (arr[] =5,4,3,2,1) is + +**Choices** +- [x] 5&4 +- [ ] 1&2 +- [ ] 1&4 +- [ ] 4&3 + +--- + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +### Maximum AND pair Approach + + +#### Brute Force +Using two for loops and calculating **bitwise &** for all possible pairs and storing the maximum of all of them. + +#### Complexity +**Time Complexity:** O(N^2) +**Space Complexity:** O(1) + +#### Observation +1. When bit is set in both the numbers, that bit in their **&** will be 1 +2. For answer to be maximum, we will want the set bit to be present towards as left as possible. +3. This indicates that we should start processing the numbers from MSB. + +#### Optimized Solution + +* Iterate from the Most significant bit to Least significant bit and for all the numbers in the array, count the numbers for which that bit is set +* If the count comes out to be greater than 1 then pairing is possible, so we include only the elements with that bit set into our vector. Also, set this bit in your answer. +* If the count is 0 or 1, the pairing is not possible, so we continue with the same set and next bit position. + +#### Dry Run + +Example: { 26, 13, 23, 28, 27, 7, 25 } + +26: 1 1 0 1 0 +13: 0 1 1 0 1 +23: 1 0 1 1 1 +28: 1 1 1 0 0 +27: 1 1 0 1 1 +07: 0 0 1 1 1 +25: 1 1 0 0 1 + +1. Let's start with MSB, **at position 4**, there are 5 numbers with set bits. Since count is >=2, we can form a pair. Therefore, in answer 1 will be present at this position. +ans: + +| 1 | _ | _ | _ | _ | +| -------- | -------- | -------- | -------- | -------- | + + + +We will remove all numbers where 0 is present. +[13 and 7 gets removed or are set to 0] + + + + +2. At position 3, there are 4 numbers with set bits(which haven't been cancelled). Since count is >=2, we can form a pair. Therefore, in answer 1 will be present at this position. +ans: + +| 1 | 1 | _ | _ | _ | +| -------- | -------- | -------- | -------- | -------- | + +We will remove all numbers where 0 is present. +[23 gets removed or is set to 0] + + + +3. At position 2, there is 1 number with set bit. Since count is less than 2, we can't form a pair. Therefore, in answer 0 will be present at this position. +ans: + +| 1 | 1 | 0 | _ | _ | +| -------- | -------- | -------- | -------- | -------- | + +We will NOT remove any number. + + +4. At position 1, there are 2 numbers with set bits. Since count is >=2, we can form a pair. Therefore, in answer 1 will be present at this position. + +ans: + +| 1 | 1 | 0 | 1 | _ | +| -------- | -------- | -------- | -------- | -------- | + +We will remove all numbers where 0 is present. +[28 and 25 gets removed or are set to 0] + + + + +5. At position 0, there is 1 number with set bit. Since count is <2, we can't form a pair. Therefore, in answer 0 will be present at this position. + +ans: + +| 1 | 1 | 0 | 1 | 0 | +| -------- | -------- | -------- | -------- | -------- | + +We will NOT remove any number. + +**We are done and answer final answer is present in variable ans**. + +--- +### Maximum AND pair Pseudocode +#### Pseudocode +```cpp + int ans = 0; + + for (int i = 31; i >= 0; i--) { + //count no. of set bits at ith index + int count = 0; + + for (int j = 0; j < n; j++) { + if (arr[j] & (1 << i)) + cnt++; + } + + //set that bit in ans if count >=2 + if (count >= 2) { + ans = ans | (1 << i); + + //set all numbers which have 0 bit at this position to 0 + for (int j = 0; j < n; j++) { + if (arr[j] & (1 << i) == 0) + arr[j] = 0; + } + + } + } + + print(ans); + +//The numbers which cannot be choosen to form a pair have been made zero + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + + + +Similarly, if we have to find maximum & of triplets then we will do for count>=3 and for quadruples as count >= 4 and so on ... + + +--- +### Problem 5 Count of pairs with maximum AND + +Calculate the Count of Pairs for which bitwise & is maximum (GOOGLE Interview Question) + +#### Solution: + +Do exactly as above and then traverse on the array and find the number of elements which are greater than 0 + +Required answer will be Nc2 or N(N-1)/2 + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + diff --git a/Academy DSA Typed Notes/Advanced/DSA DP 1 One Dimentional.md b/Academy DSA Typed Notes/Advanced/DSA DP 1 One Dimentional.md new file mode 100644 index 0000000..cc6e314 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA DP 1 One Dimentional.md @@ -0,0 +1,342 @@ +# DP 1: One Dimentional + +--- +## Fibonacci Series + +`0 1 1 2 3 5 8 13 21 ...` + +### fibonacci Expresion +* `fib(n) = fib(n-1) + fib(n-2)` +* base case for the fibonacci expression -> `fib(0) = 0; fib(1) = 1` + +### Psuedocode +```java +int fib(n) { + if (n <= 1) return n; + return fib(n - 1) + (n - 2); +} +``` +> Time complexity for the above code : **O(2^N)** +> Space Complexity for the above code : **O(N)** + +--- +### Problem 1 Fibonacci Series + + +#### Properties of Dynamic Programming +* **Optimal Substructure** - i.e. solving a problem by solving smaller subproblems +* **Overlapping Subproblems** - solving some subproblems multiple times + +#### Solution for Dynamic Programming +* Store the information about already solved sub-problem and use it + + +#### Psuedocode of Fibonacci series using dynamic Programming +```java +int f[N + 1] // intialize it with -1 + +int fib(n) { + if (N <= 1) return n; + + // if already solved, don't repeat + if (f[N] != -1) return f[N]; + + // store it + f[N] = fib(n - 1) + (n - 2); + return f[N]; +} +``` +**Two main operations performed in the above code of dynamic programming:** +* If we have already solved a problem just return the solution, don't repeat the step +* If not solved, solve and store the solution + +#### Dry Run + + + +We're going to figure out what **`fib(5)`** is using a method called recursion, and we'll keep track of our answers in an array. Here's how it works, step by step: + +* **Starting Point:** +We want to find out what fib(5) is. Our array, where we store our results, starts with -1 in every spot because we haven't calculated anything yet. + +* **Breaking it Down:** +To get fib(5), we first need to know fib(4) and fib(3). + +* **Going Deeper:** +For fib(4), we need fib(3) and fib(2). And for fib(3) (the one we saw earlier), we also need fib(2) and fib(1). + +* **Even Deeper:** +To find fib(2), we look at fib(1) and fib(0). + +* **Simple Answers:** +Now, fib(1) and fib(0) are easy; they are 1 and 0. We use these to find out fib(2), which is 1 (0 + 1). Store it before moving forward. + +* **Building Up:** +We keep using these small answers to find the bigger ones. If we already know an answer (like fib(2)), we don't have to calculate it again; we just use the answer from our array. + +By the end, we'll have the answer to fib(5), and all the smaller fib numbers stored in our array! + +#### Time and Space Complexity + +**Time Complexity for the above code is O(N)** and **space complexity is O(N)**. Thus, we were able to reduce the time complexity from O(2^N) to O(N) using dynamic programing + +--- +### Dynamic Programming Types + + +#### Types of DP Solution: +*Dynamic programming solution can be of two types*: +* **`Top-Down`** [Also know as **Memoization**] + * It is a recursive solution + * We start with the biggest problem and keep on breaking it till we reach the base case. + * Then store answers of already evaluated problems. + +* **`Bottom-Up`** + * It is an iterative solution + * We start with the smallest problem, solve it and store its result. + * Then we keep on moving to the bigger problems and use the already calculated results from sub-problems. + + +#### Bottom Up Approach for Fibonacci series +#### Psuedocode +```java +int fib[N + 1]; + +fib[0] = 0; +fib[1] = 1; + +for (i = 2, i <= N; i++) { + fib[i] = fib[i - 1] + fib[i - 2]; +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +> Through this approach we were able to eliminate recursive stack. + +#### Further optimising the Space Complexity + +If seen closely, the above approach can be optimised by using just simple variables instead of an array. In this way, we can further optimize the space. + +#### Pseudocode +```java +int a = 0; +int b = 1; +int c; +for (int i = 2; i <= N; i++) { + c = a + b; + a = b; + b = c; +} +``` +> In the above code we were able to optimize the space complexity to O(1). + +--- +### Question +What is the purpose of memoization in dynamic programming? + +**Choices** + +- [ ] To minimize the space complexity of the algorithm +- [x] To store and reuse solutions to subproblems +- [ ] To calculate results of all calls +- [ ] To improve the readability of the code + +--- +### Question +Which approach is considered as an iterative process? + +**Choices** + +- [ ] Top-down approach +- [x] Bottom-up approach +- [ ] Both are iterative +- [ ] Neither is iterative + + +--- +### Problem 2 Climbing Staircase + + + +*Calculate the number of ways to reach the Nth stair. You can take 1 step at a time or 2 steps at a time.* + + + +**`CASE 1: (number of stairs = 1)`** +{1} + + + + +Number of ways to reach first stair : 1 (as shown in fig) + + +**`CASE 2: (number of stairs = 2)`** + +{1, 1} +{2} + + + +Number of ways to reach two stairs : 2 (as shown in fig) + +**`CASE 3: (number of stairs = 3)`** + +{1, 2} +{1, 1, 1} +{2, 1} + + + +Number of ways to reach two stairs : 3 (as shown in fig) + +**`CASE 4: (number of stairs = 4)`** +{1, 1, 2} +{2, 2} +{1, 2, 1} +{1, 1, 1, 1} +{2, 1, 1} + + + +--- +### Question +In Stairs Problems, the result for N=4 + +**Choices** +- [ ] 4 +- [x] 5 +- [ ] 6 +- [ ] 7 + +**Explanation:** + +To reach 1st staircase : 1 way +To reach 2nd staircase : 2 ways +To reach 3rd staircase : 3 ways +To reach 4th staircase : 5 ways + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +### Problem 2 Climbing Staircase Approach +#### Approach + +We can come to 4th stair from 2nd and 3rd step. +* If I get to know #steps to reach stair 3, we can take length 1 step and reach stair 4. +* Similarly, if I get to know #steps to reach stair 2, we can take length 2 step and reach stair 4. + + + + + + + +* Number of ways we can reach to the nth step is either by (n - 1) or (n - 2). +* Answer will be summation of number of ways to reach (n - 1)th step + number of ways to reach (n - 2)th step + +We can see that the above has been deduced to fibonacii expression + +--- +### Problem 3 Get Minimum Squares + +*Find minimum number of perfect squares required to get sum = N. (duplicate squares are allowed)* + +*example 1 --> N = 6* + +sum 6 can be obtained by the addition of following squares: +* `1^2+1^2+1^2+1^2+1^2+1^2` +* `1^2+1^2+2^2` --> minimum number of squares is 3 in this case + +*example 2 --> N = 10* + +sum 10 can be obtained by the addition of following squares: +* `1^2+1^2+..... 10 times` +* `2^2 + 1^2..... 6 times` +* `2^2 + 2^2 + 1^2 + 1^2` +* `3^2 + 1^2 `--> minimum number of squares is 2 in this case + +*example 3 --> N = 9* + +sum 10 can be obtained by the addition of following squares: +* `1^2+1^2+..... 9 times` +* `2^2 + 1^2..... 5 times` +* `2^2 + 2^2 + 1^2 ` +* `3^2` --> minimum number of squares is 1 in this case + + +--- +### Question +What is the minimum number of perfect squares required to get sum = 5. (duplicate squares are allowed) + +**Choices** +- [ ] 5 +- [ ] 1 +- [x] 2 +- [ ] 3 + + +**Explanation**: + +sum 5 can be obtained by the addition of following squares: +* `1^2 + 1^2 + 1^2 + 1^2 + 1^2` +* `2^2 + 1^2` --> minimum number of squares is 2 in this case + + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Get Minimum Squares Approach + +#### Approach 1 +* Can we simply do **`N - (nearest perfect square)`** ? + + * Verifying approach 1 with example N=12 + * 12-9 (closest square) = 3 + * 3-1 = 2 + * 2-1 = 1 + * 1-1 = 0 + * We are using 4 perfect squares, whereas the minimum number of square is 3 (2^2 + 2^2 +2^2) so approach 1 is not useful in this case + +#### Brute Force Approach +* Try every possible way to form the sum using brute force to solve a example N = 12 + + +The above image shows all possiblities to achieve 12. + +Now, to get minimum sum of 12 we will find minimum square of 11 or minimum square of 8 or minimum square of 3 + 1. + +The above is a recursive problem where we can see overalapping subproblems, like for N=7. + +#### Dynamic Programming Approach +Here optimal structure has been obtained as well as overlapping subproblems + +So, we can say that +`square(i) = 1 + min{ squares(i - x^2) for all x^2 <= i} `and base case is square[0] = 0 + +#### Psuedocode +```java +int dp[N + 1]; //initialise (-1) +int psquares(int N, int dp[]) { + if (n == 0) return 0; + if (dp[N] != -1) return dp[N]; + ans = int - max; + for (x = 1; x * x <= N; x++) { + ans = min(ans, psquares(N - x ^ 2)); // dp + } + dp[N] = 1 + ans; + return dp[N]; +} +``` +Time complexity for the above code is O(N(sqrt(N))) and space complexity is O(N). + diff --git a/Academy DSA Typed Notes/Advanced/DSA DP 2 Two Dimentional.md b/Academy DSA Typed Notes/Advanced/DSA DP 2 Two Dimentional.md new file mode 100644 index 0000000..3045270 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA DP 2 Two Dimentional.md @@ -0,0 +1,724 @@ +# DP 2: Two Dimensional + +--- +## Problem 1 Maximum Subsequence Sum + +Find maximum subsequence sum from a given array, where selecting adjacent element is not allowed. + +**Examples** +Example 1: ar[] = {9, 4, 13} +Output 1: 22. Since out of all possible non adjacent element subsequences, the subsequence (9, 13) will yield maximum sum. + +Example 2: ar[] = {9, 4, 13, 24} +Output 2: 33 (24 + 9) + + +--- +### Question +Find maximum subsequence sum from `[10, 20, 30, 40]`, where selecting adjacent element is not allowed. + +**Choices** +- [ ] 70 +- [x] 60 +- [ ] 100 +- [ ] 50 + +**Explanation**: + +Maximum Subsequence is 60. Since, Out of all possible non adjacent element subsequences, the subsequence (20, 40) will yield maximum sum of 60. + + +--- +### Maximum Subsequence Sum Brute Force Approach + +:::warning +Please take some time to think about the brute force approach on your own before reading further..... +::: + +#### Brute Force Approach +- Consider all the valid subsequences **`(this a backtracking step)`**. +- For creating subsequences, for every element we can make a choice, whether to select it or reject it. +- Say, we start from right most element. If we keep it, then (n - 1)th element can't be considered, so jump to (n - 2)th. If we don't, then (n - 1)th element can be considered. So on... + + + + + +The above image shows tree which has all the choices of selection. Here we can see that the choices are overlapping. + +Moreover, as the problem can be broken into smaller problems and has overlapping sub problems, we can use **dynamic programming**. + + +--- +### Maximum Subsequence Sum Top Down Approach + +#### Top Down Approach +So for **maxSum(i)** there are two options: +* either we can select element present at index i + * if we select that element we will include its value ie ar[i] and the recursive call will be **maxSum(i-2)** +* or we cannot select the element present at index i + * so in this case we will not include its value and will make recursive call which is **maxSum(i-1)** + +`dp[i] = stores the maximum value that can be obtained by selecting 0 to ith toy.` + +The maximum of the choice we make will give us the final answer + +#### Psuedocode + +```cpp +int dp[N] //initialize it with negative infinity + +// i will be initialised with N-1, i.e we start with the last element +int maxSum(int[] arr, i, dp[N]) { + if (i < 0) { + return 0 + } + if (dp[i] != -infinity) { + return dp[i] + } + //Don't consider the ith element, in this case we can consider (i-1)th element + f1 = maxSum(arr, i - 1, dp); + + //Consider the ith element, in this case we can't consider (i-1)th element, so we jump to (i-2)th element + f2 = arr[i] + maxSum(arr, i - 2, dp); + + ans = max(f1, f2) + + dp[i] = ans; + + return ans +} +``` + +#### Time & Space Complexity + +**Time complexity:** O(N). As we are filling the DP array of size N linearly, it would take O(N) time. +**Space complexity:** O(N), because of dp array of size N. + + +--- +### Maximum Subsequence Sum Bottom Up Approach + +**Problem 1** +**`dp[i] is defined as the maximum subsequence sum from [0 - i] provided no adjacent elements are selected`** + +arr = {9, 4, 13, 24} + +We can start from arr[0] and we have two choices: either we can select arr[0] or reject. +* If we select it, the maximum value we can acheive is arr[0] = 9 +* If we reject it, the value which we will get is 0 +* So, we will store arr[0] in dp[0] + +* Now, we will look at arr[0] and arr[1] to find the maximum + * As arr[0] > arr[1], we will store arr[0] in dp[1] +* Similary we will repeat the above steps to fill dp[]. + + +#### Psuedocode + +```cpp +dp[N] +for(i = 0; i < N; i++){ + dp[i] = max(dp[i - 1], arr[i] + dp[i - 2]) +} +return dp[N - 1] +``` + + +#### Time & Space Complexity +**Time complexity:** O(N). As we are filling the DP array of size N linearly, it would take O(N) time. +**Space complexity:** O(N), because of dp array of size N. + +--- +### Problem 2 Count Unique Paths + +Given mat[n][m], find total number of ways from (0,0) to (n - 1, m - 1). We can move 1 step in horizontal direction or 1 step in vertical direction. + + + + +**Example** + + + + +> `h` represents movement in horizontal direction and `v` represents movement in vertical direction + +**Ans:** 6 + + + +--- +### Question +Find the total number of ways to go from (0, 0) to (1, 2) + +| o | | | +|---|---|---| +| | | **o** | + + +**Choices** +- [ ] 1 +- [ ] 2 +- [x] 3 +- [ ] 4 + + +**Explanation**: + +The 2D matrix dp is + +| | 0 | 1 | 2 | +|---|---|---|---| +| 0 | 1 | 1 | 1 | +| 1 | 1 | 2 | 3 | + +From here, the number of ways to go from (0, 0) to (1, 2) is 3. + + +--- +### Count Unique Paths Brute Force Approach + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Brute Force Appoarch +**Backtracking**, i.e., start from (0, 0) and try all possible scenarios to reach (n - 1, m - 1) + +#### Observation +Can we break it into subproblems? +- We can reach (n - 1, m - 1) in one step (by moving vertically) from (n - 2, m - 1) +- We can reach (n - 1, m - 1) in one step (by moving horizontally) (n - 1, m - 2) + + + + + +#### Recursive Relation + +**ways(i, j) = ways(i - 1, j) + ways(i, j - 1)** + +#### Base Condition +- When i == 0, we have only one path to reach at the end, i.e., by moving vertically. +- Similary, when j == 0, we have only one path to reach at the end, i.e., by moving horizontally. + +Therefore, **ways(0, j) = ways(i, 0) = 1** + +#### Pseudocode: +```java +int ways(i, j) { + if (i == 0 || j == 0) { + return 1; + } + return ways(i - 1, j) + ways(i, j - 1); +} +``` + +Time Complexity: O(2 ^ (N * M)), as at every step we have two options, and there are total of N * M cells. + + +--- +### Count Unique Paths Optimization + +#### Optimization using DP + +We can see the **optimal substructure** in this problem as it can be defined in terms of smaller subproblems. + +**Are there overlapping subproblems as well?** + + + + +We can see that, `(i - 1, j - 1)` are the overlapping subproblems. + +***Since there is optimal substructure and overlapping subproblems, DP can be easily applied.*** + +*Which type of array should be used?* +Since two args (i and j) are varying in above method, 2-d storage is needed of size N x M. + +#### Top Down Approach + +**`dp[i][j] = It is defined as the total ways to reach from 0,0 to i,j`** + +#### Pseudocode +```java +int dp[N][M]; // initialized with -1 +int ways(i, j) { + if (i == 0 || j == 0) { + return 1; + } + + if (dp[i][j] != -1) { + return dp[i][j]; + } + ans = ways(i - 1, j, dp) + ways(i, j - 1, dp); + dp[i][j] = ans; + return ans; +} +``` +#### Complexity +**Time Complexity:** O(N * M), as we are filling a matrix of size N * M. +**Space Complexity:** O(N * M), as we have used dp matrix of size N * M. + +> *In how many ways can we reach (0, 0) starting from (0, 0)?* +> +> If you say 0, that means there is no way to reach (0, 0) or (0, 0) is unreachable. Hence, to reach (0, 0) from (0, 0), there is 1 way and not 0. + +#### Bottom Up Approach: +Consider a 2D matrix `dp` of size N * M. +`dp[i][j] = It is defined as the total ways to reach from 0,0 to i,j` + +In bottom up approach, we start from the smallest problem which is (0, 0) in this case. +- No. of ways to move (0, 0) from (0, 0) = ways(0, 0) = 1 +- Similarly, ways(0, 1) = ways(0, 2) = . . . = 1 +- Also, ways(1, 0) = ways(2, 0) = . . . = 1 +- Now, ways(1, 1) = ways(1, 0) + ways(0, 1) = 2 +- Similarly, ways(1, 2) = ways(1, 1) + ways(0, 2) = 3, and so on. + + + +#### Pseudocode +```java +dp[N][M]; +// Initialize `dp` row - 0 and col - 0 with 1. +for (i = 1; i <= N; i++) { + for (j = 1; j <= M; j++) { + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + } +} +return dp[N - 1][M - 1]; +``` + +Time Complexity: O(N * M) +Space Complexity: O(N * M) + + +#### Can we further optimize the space complexity? + +- The answer of every row is dependent upon its previous row. +- So, essentially, we require two rows at a time - (1) current row (2) previous row. Thus, the space can be optimized to use just two 1-D arrays. + + +--- +### Problem 3 Total number of ways to go to bottom right corner from top left corner + + +Find the total number of ways to go to bottom right corner (N - 1, M - 1) from top left corner (0, 0) where cell with value 1 and 0 represents non-blocked and blocked cell respectively. +We can either traverse one step down or one step right. + + + + +#### Solution + + + +| 1 | 1 | 1 | 1 | +| - | - | - | - | +| 1 | 0 | 1 | 0 | +| 0 | 0 | 1 | 1 | +| 0 | 0 | 1 | 2 | +| 0 | 0 | 1 | 3 | + + +The given problem is just a variation of above problem. Only advancement is that if cell value has 0, then there is no way to reach the bottom right cell. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Pseudocode (Recursive Approach) + +```cpp +if (mat[i][j] != 0) { + ways(i, j) = ways(i - 1, j) + ways(i, j - 1); +} else { + ways[i][j] = 0; +} +``` + +Similar base condition can be added to top-down and bottom-up approach to optimize it using DP. + + +--- +### Question +How many unique paths in the grid from (0, 0) to (2, 2) ? + +| 1 | 1 | 1 | +|-------|-------|-------| +| **0** | **0** | **0** | +| **1** | **1** | **1** | + +where cell with value 1 and 0 represents non-blocked and blocked cell respectively. + +**Choices** +- [x] 0 +- [ ] 1 +- [ ] 2 +- [ ] 3 + + +**Explanation**: + +On the Grid, Row 1 is completely blocked. So there is no path from (0, 0) to (2, 2). + +Thus, the Total number of unique paths is 0. + +--- +### Problem 4 Dungeons and Princess + + +Find the minimum health level of the prince to start with to save the princess, where the negative numbers denote a dragon and positive numbers denote red bull. + +Redbull will increase the health whereas the dragons will decrease the health. + +The prince can move either in horizontal right direction or vertical down direction. +If health level <= 0, it means prince is dead. + + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Observation +One might argue to solve it by finding the path with minimum sum or maximum sum. + +Let's check does it even work or not? + +#### Using path with minimum sum(fails) +- For the above matrix, the path with minimum sum is -3 -> -6 -> -15 -> -7 -> 5 -> -3 -> -4, which yields sum as 33. So, minimum health level should be (3 + 6 + 15 + 7) + 1 = 32, right? +- No because if we start with **health 4** and follow the path -3 -> 2 -> 4 -> -5 -> 6 -> -2 -> -4, we can definitely reach the princess with lesser initial health. +- Thus, finding the path with minimum sum doesn't work/ + +#### Using path with maximum sum(fails) + + + + +- For the above matrix, the path with maximum sum is -2 -> -8 -> 100 -> 1, which yields sum as 91. So, minimum health level should be (2 + 8) + 1 = 11, right? +- No because if we start with **health 7** and follow the path -2 -> -1 -> -3 -> 1, we can definitely reach the princess with lesser initial health. +- Similarly, finding the path with maximum sum doesn't work. + +> NOTE: +> Finding the path with maximum or minimum sum is a greedy approach, which doesn't work for this problem. + +#### How to approach the problem then? +Let's start with finding the smallest problem. + +***Where does smallest problem lie?* (0, 0) ?*** **NO** + +The smallest problem lies at **`(M - 1, N - 1)`**, because we need to find the minimum health to finally enter that cell to save the princess. + +***Now, what should be the minimum health to enter a cell?*** + +Suppose the cell(M - 1, N - 1) has value -4, then to enter the cell needed is: minimum_health + (-4) > 0 => minimum_health + (-4) = 1 => minimum_health = 5 + + + + +There are two ways to enter the cell: +**(1)** via TOP **(2)** via LEFT. +***Which one to choose?*** + +We know, to enter the cell with value -4, the minimum health should be 5. Therefore, if we want to enter from top cell with value -2, then x + (-2) = 5; x = 7, where 'x' is minimum health to enter top cell. + +Similary, y + (-3) = 5; y = 8. + + + +Hence, we should choose minimum of these and enter the cell via top. + +**What is the minimum health required to enter a cell (i, j) which has two options to move ahead?** + + + +
+
+ + + +> If the minimum health evaluates to negative, we should consider 1 in place of that as with any health <= 0, the prince will die. + +Let's fill the matrix using the same approach. + + + + + +Here, `dp[i][j]` = min health with which prince should take the entry at (i, j) so that he can save the princess. + +--- +### Question +What is the Time Complexity to find minimum cost path from (0,0) to (r-1, c-1)? + +**Choices** +- [ ] O(max(r, c)) +- [ ] O(c ) +- [x] O(r * c) +- [ ] O(r + c) + +--- +### Dungeons and Princess Algorithm and Pseudocode +#### Algorithm +```java +arr[i][j] + x = min(dp[i + 1][j], dp[i][j + 1]) +x = min(dp[i + 1][j], dp[i][j + 1]) - arr[i][j] +``` + +Since `x` should be > 0 + +```java +x = max(1, min(dp[i + 1][j], dp[i][j + 1]) - arr[i][j]) +``` + +#### Pseudocode: +```java +declare dp[N][M]; +if (arr[N - 1][M - 1] > 0) { + dp[N - 1][M - 1] = 1; +} else { + dp[N - 1][M - 1] = 1 + abs(arr[N - 1][M - 1]); +} + +// Fill the last column and last row + +for (i = N - 2; i >= 0; i--) { + for (j = M - 2; j >= 0; j--) { + x = max(1, min(dp[i + 1][j], dp[i][j + 1]) - arr[i][j]); + dp[i][j] = x; + } +} + +return dp[0][0]; +``` + +#### Complexity +**Time Complexity:** O(N * M) +**Space Complexity:** O(N * M) + + +--- +### Catalan Numbers + + +The Catalan numbers form a sequence of natural numbers that have numerous applications in combinatorial mathematics. Each number in the sequence is a solution to a variety of counting problems. The Nth Catalan number, denoted as Cn, can be used to determine: + +* The number of correct combinations of N pairs of parentheses. +* The number of distinct binary search trees with N nodes, etc. + +Here is the sequence, +``` +C0 = 1 +C1 = 1 +C2 = C0 * C1 + C1 * C0 = 2 +C3 = C0 * C2 + C1 * C1 + C2 * C0 = 5 +C4 = C0 * C3 + C1 * C2 + C2 * C1 + C3 * C0 = 14 +C5 = C0 * C4 + C1 * C3 + C2 * C2 + C3 * C1 + C4 * C0 = 42 +``` + +#### Formula + + + + + + +#### Psuedo Code + +```cpp +int C[N + 1]; + +C[0] = 1; +C[1] = 1; + +for (int i = 2; i <= N; i++) { + for (int j = 0; j < i; j++) { + C[i] += C[j] * C[N - 1 - j]; + } +} +``` + +#### Complexity + +**Time Complexity:** O(N^2^) +**Space Complexity:** O(N) + +Now, Let's look into a problem, which can be solved by finding the **Nth catalan number**. + + +--- +### Problem 5 Total Number of Unique BSTs + + +You are given a number N, Count Total number of Unique Binary Search Trees, that can be formed using N distinct numbers. + +**Example** + +**Input:** +N = 3 + +**Output:** +5 + +**Explanation:** + +The Unique binary Search Trees are +``` + 30 10 30 10 20 + / \ / \ / \ + 10 20 20 30 10 30 + \ \ / / + 20 30 10 20 +``` + +--- +### Question +Count Total number of Unique Binary Search Trees, that can be formed using 2 distinct numbers + +**Choices** +- [ ] 1 +- [x] 2 +- [ ] 5 +- [ ] 4 + +**Explanation**: + +Lets take 2 distinct numbers as [10, 20] + +The possible BSTs are +``` + 20 10 + / \ + 10 20 +``` +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Total Number of Unique BSTs Dryrun + + +Lets take N = 5, the numbers are [10, 20, 30, 40, 50]. + +Lets keep each number as the root! one by one. + +**10 as root** +``` + 10 + \ + \ + \ + 20, 30, 40, 50 +``` + +Here we notice that, 20, 30, 40 and 50 can be structured by various sub-roots. So, lets denote by C4. + +Also on the right side, there is no elements. So denoting by C0. + +`10 as root => C0 * C1` + + +**20 as root** +``` + 20 + / \ + / \ + / \ + 10 30, 40, 50 +``` + +There are 1 element on the left side and 3 elements on the right side. + +`20 as root => C1 * C3` + + +**30 as root** +``` + 30 + / \ + / \ + / \ + 10, 20 40, 50 +``` + + +There are 2 element on the left side and 2 elements on the right side. + + +`30 as root => C2 * C2` + + +**40 as root** +``` + 40 + / \ + / \ + / \ + 10, 20, 30 50 +``` + + +There are 3 element on the left side and 1 elements on the right side. + + +`40 as root => C0 * C1` + +**50 as root** +``` + 50 + / + / + / + 10, 20, 30, 40 +``` + +There are 4 element on the left side and 1 elements on the right side. + + +`10 as root => C4 * C0` + +C5 = C0 * C4 + C1 * C3 + C2 * C2 + C3 * C1 + C4 * C0 + +which is 42. + +#### Solution + +The Solution for finding the total number of Unique BSTs is the **Nth Catalan Number**. + + + +--- +### Total Number of Unique BSTs Pseudo Code + +#### Psuedo Code + +The pseudo code is same as the Catalan Number Psuedo code. + +```cpp +function findTotalUniqueBSTs(int N) { + int C[N + 1]; + + C[0] = 1; + C[1] = 1; + + for (int i = 2; i <= N; i++) { + for (int j = 0; j < i; j++) { + C[i] += C[j] * C[N - 1 - j]; + } + } + + return C[N]; +} +``` + +#### Complexity + +**Time Complexity:** O(N^2^) +**Space Complexity:** O(N) + + diff --git a/Academy DSA Typed Notes/Advanced/DSA DP 3 Knapsack.md b/Academy DSA Typed Notes/Advanced/DSA DP 3 Knapsack.md new file mode 100644 index 0000000..155722f --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA DP 3 Knapsack.md @@ -0,0 +1,312 @@ +# DP 3: Knapsack + +--- +## Knapsack Problem + +Given N objects with their values Vi profit/loss their weight Wi. A bag is given with capacity W that can be used to carry some objects such that the total sum of object weights W and sum of profit in the bag is maximized or sum of loss in the bag is minimized. + +We will try Knapsack when these combinations are given: +* number of objects will be N +* every object will have 2 attributes namingly value and weight +* and capacity will be given + +--- +### Problem 1 Fractional Knapsack + +Given N cakes with their happiness and weight. Find maximum total happiness that can be kept in a bag with capacity = W (cakes can be divided) + +**Example**: +N = 5; W = 40 +Happiness of the 5 cakes = [3, 8, 10, 2, 5] +Weight of the 5 cakes = [10, 4, 20, 8, 15] +Goal - happiness should be maximum possible and the total sum of weights should be <= 40. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Approach** + +**`Since we can divide the objects, hence they can be picked based on their value per unit weight.`** + +**`For per unit weight, below are the happiness values:`** +* Cake 1: `happiness = 0.3`; +* Cake 2: `happiness = 2`; +* Cake 3: `happiness = 0.5`; +* Cake 4: `happiness = 0.25`; +* Cake 5: `happiness = 0.33`; + + + + +**Solution** + +**`Arrange the cakes in descending order with respect to happiness/weight and start picking the element`** +* Select the 2nd cake (happiness = 2), reducing capacity to 36(40-4). +* Choose the 3rd cake (happiness = 0.5), further reducing capacity to 16(36-20). +* Opt for the 5th cake (happiness = 0.33), leaving a capacity of 1(16-15). +* Take a part of the 1st cake (happiness = 0.3), using up the remaining capacity. +* Total happiness achieved: 23.3 (8 + 10 + 5 + 0.3). + +**Time complexity** of the above solution is O(Nlog(N)) because it requires sorting with respect to `happiness/weight`. + +**Space complexity** of the above solution is O(1).* + +#### Pseudo Code +```cpp +public class Solution { + class Items { + double cost; + int weight, value, ind; + Items(int weight, int value, double cost) { + this.weight = weight; + this.value = value; + this.cost = cost; + } + } + + public int solve(int[] A, int[] B, int C) { + Items[] iVal = new Items[A.length]; + for (int i = 0; i < A.length; i++) { + double cost = (A[i] * 1.0) / B[i]; + iVal[i] = new Items(B[i], A[i], cost); + } + Arrays.sort(iVal, new Comparator < Items > () { + @Override + public int compare(Items o1, Items o2) { + if (o1.cost >= o2.cost) { + return -1; + } + return 1; + } + }); + double totalValue = 0.0; + for (int i = 0; i < A.length; i++) { + int curWt = iVal[i].weight; + int curVal = iVal[i].value; + if (C >= curWt) { + C = C - curWt; + totalValue += curVal; + } else { + totalValue += (C * iVal[i].cost); + break; + } + } + + return (int)(totalValue * 100); + + } +} +``` + +--- +### Flipkart's Upcoming Special Promotional Event + + +Flipkart is planning a special promotional event where they need to create an exclusive combo offer. The goal is to create a combination of individual items that together offer the highest possible level of customer satisfaction (indicating its popularity and customer ratings) while ensuring the total cost of the items in the combo does not exceed a predefined combo price. + +--- +### Problem 2 : 0-1 Knapsack + +## 0-1 Knapsack +In this type of knapsack question, **division of object is not allowed.** + +### Question + +Given N toys with their happiness and weight. Find maximum total happiness that can be kept in a bag with capacity W. Division of toys are not allowed. + +--- +### Question +In the Fractional Knapsack problem, what is the key difference compared to the 0/1 Knapsack? + +**Choices** +- [ ] Items can only be fully included or excluded. +- [x] Items can be partially included, allowing fractions. +- [ ] The knapsack has infinite capacity. +- [ ] The knapsack has a fixed capacity. + + + +**Explanation** + + In the Fractional Knapsack problem, items can be included in fractions, enabling optimization of the total value based on weight. + + +**Example**: +N = 4; W = 7 +Happiness of the 4 toys = [4, 1, 5, 7] +Weight of the 4 toys = [3, 2, 4, 5] + +> If we buy toys based on maximum happiness or maximum happiness/weight we may not get the best possible answer. + +:::warning +Please take some time to think about the bruteforce approach on your own before reading further..... +::: + +#### Brute Force Approach: +* Consider all subsets of items and select the one with highest summation of happiness. + +Since there are in total 2^N^ subsequences and we have to consider each of them. Therefore the time complexity is: + +#### Dry Run of Brute Force Apporach + + + +In the above figure each element is taken and its selection is determined based on happiness and weight. + +> Here we can notice optimal sub structure as well as overlapping sub problems. +> *Thus we can use dynamic progamming in this case* + +If index and capacity can define one unique state total number of unique states are `O(N * (W + 1))` which is `O(N * W)`, as index will go from 0 to N - 1 and weight will go from 0 to W. + +```cpp +dp[N][W] = max happiness (considering N objects and capacity W) +``` + + + +> Here taking N = i and W = j, we have two choices either to select dp[i][j] or to reject it. On selecting it will result into` h[i] + dp[i - 1][j - wt[i]]`(h[i]=happiness of i) and on rejecting it will be `dp[i - 1][j]`. + +#### Base Case +* for all j when i = 0, dp[0][j] = 0 +* for all i when j = 0, dp[i][0] = 0 + +#### Psuedocode + +```java +//for all i,j dp[i][j]=0 +for (i--> 1 to N) { // 1based index for input + for (j--> 1 to W) { + if (wt[i] <= j) { + dp[i][j] = max(dp[i - 1][j], h[i] + dp(i - 1)(j - wt[i])) + } else { + dp[i][j] = dp[i - 1][j] + } + } +} +return dp[N][w] +} +``` + + +The dimensions should be (N + 1) * (W + 1) as the final answer would be at dp[N][W] + +#### Dry run +taking the N = 4 and W = 7 +Happiness of the 4 toys = [4, 1, 5, 7] +Weight of the 4 toys = [3, 2, 4, 5] + + + +* Initially, we filled the `dp` matrix with zeros. Now, we will fill every position one by one. + - At i = 1, j = 1 + wt[i] = wt[1] = 3 + since wt[i] > j, dp[i][j] = dp[i - 1][j] => dp[1][1] = dp[0][1] = 0 +* At i = 1, j = 2 + wt[i] = wt[1] = 3 + since wt[i] > j, dp[i][j] = dp[i - 1][j] => dp[1][2] = dp[0][2] = 0 +* At i = 1, j = 3 + wt[i] = wt[1] = 3 + since wt[i] <= j, dp[i][j] = max(dp[i - 1][j], h[i] + dp[i - 1][j - wt[i]]) + => dp[1][3] = max(dp[0][2], h[1] + dp[0][0]) = max(0, 4 + 0) = 4 + +Similary we wil follow the above to fill the entire table. + +> Time complexity for the above code is O(N * W) + +> Space Complexity for the above code is O(N * W), we can furture optimize space complexity by using 2 rows. So the space complexity is O(2W) which can be written as O(W). + +--- +### Problem 3 Unbounded Knapsack + +## Unbounded Knapsack or 0-N Knapsack +* objects cannot be divided +* same object can be selected multiple times + +#### Question + +Given N toys with their happiness and weight. Find more total happiness that can be kept in a bag with capacity W. Division of toys are not allowed and infinite toys are available. + +#### Example + +N = 3; W = 8 +Happiness of the 3 toys = [2, 3, 5] +Weight of the 3 toys = [3, 4, 7] + +*In this case we will select second index toy 2 times. Happiness we will be 6 and weight will be 8.* + +Now here as we do not have any limitation on which toy to buy index will not matter, only capacity will matter. + +:::warning +Please take some time to think about the brute force approach on your own before reading further..... +::: + +#### Dry Run for Brute Force Appoarch + + + +Step 1: +* if we select toy with index 1, capacity left will be `8 - wt of toy 1 = 8 - 3 = 5`. And the happiness will be `h = 2` +* Similarily if we select toy with index 2, capacity left will be `8 - wt of toy 2 = 8 - 4 = 4`. And the happiness will be `h = 3` +* if we select toy with index 3, capacity left will be `8 - wt of toy 3 = 8 - 7 = 1`. And the happiness will be `h = 5` + +Step 2: +After buying toy 1 +* Now if we buy toy 1, capacity will reduce to 2 and happiness will become 4 +* Similary if we buy toy 2, capacity will reduce to 1 and happiness will become 5 +* We cannot buy toy 3 as the capacity will be exceeded. + + +We will follow similar steps to find all the possiblity. + +> We will pick the toy with maximum happiness that is 6 in this case after selecting toy 2 firstly and then selecting toy 2 again. + +Here we can notice optimal sub structure as well as overlapping sub problems. Thus we can apply dynamic programming. + +* Unqiue states here will be` W + 1 = O(W)` because the capacity can be from 0 to W + +Base case for the above question: +* if capacity is 0, happiness is 0. So, `dp[0] = 0` + +Equation `dp[i] = max(h[i] + dp[i - wt[j]])` for all toys j + +#### Psuedocode +```java +for all i, dp[0] = 0 +for (i--> 1 to W) { + for (j--> 1 to N) { + if (wt[j] <= i) + dp[i] = max(h[i] + dp[i - wt[j]]) + } +} +return dp[W] +``` + +#### Complexity +**Time Complexity:** O(N * W) +**Space Complexity:** O(W) + +--- +### Question +We have Weight Capacity of 100 +- Values = {1, 30} +- Weights = {1, 50} + +What is the maximum value you can have? + +**Choices** +- [ ] 0 +- [x] 100 +- [ ] 60 +- [ ] 80 + +**Explanation** +There are many ways to fill knapsack. + +- 2 instances of 50 unit weight item. +- 100 instances of 1 unit weight item. +- 1 instance of 50 unit weight item and 50 + instances of 1 unit weight items. + +We get maximum value with option 2, i.e **100** + diff --git a/Academy DSA Typed Notes/Advanced/DSA DP 4 Applications of Knapsack.md b/Academy DSA Typed Notes/Advanced/DSA DP 4 Applications of Knapsack.md new file mode 100644 index 0000000..9a07494 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA DP 4 Applications of Knapsack.md @@ -0,0 +1,274 @@ +# DP 4: Applications of Knapsack + +--- + +### Question +Time Complexity of the unbounded 0-1 knapsack problem? +- W : capacity of knapsack +- N : no. of elements +- K : Max weight of any item +- P : max value of any item + +**Choices** +Chose the correct answer +- [x] O(NW) +- [ ] O(NK) +- [ ] O(NP) +- [ ] O(WK) +- [ ] O(WP) +- [ ] O(KP) + + + + +**Explanation** +For every node, we need to go to its left, that's the only way we can reach the smallest one. + +--- +## Introduction to the knapsack and DP + +### What Is Dynamic Programming? +In the context of dynamic programming, the ``knapsack problem`` refers to a classic optimization problem that can be solved using dynamic programming techniques. + +### Example +Suppose we are working on solving the fibonacci series problesm, then we can break it into step by step as follows: + + + +Let us now solve some questions related to dynamic programming. + +--- +### Problem 1 Cut the rod for maximum profit + + +A rod of length `N` and an array `A` of length `N` is given. The elements (`i`) of the array contain the length of the rod (1-based indexing). Find the maximum values that can be obtained by cutting the rod into some pieces and selling them. + +**Example** +Suppose we have the length on `N = 5` and we have to divide it then the division can be done as: + + + +Now, we can see that $9$ is the maximum value that we can get. + +#### Solution +A naive approach to solving this problem would involve considering all possible combinations of cutting the rod into pieces and calculating the total value for each combination. This can be achieved using recursion and backtracking, where for each possible cut, the value of the cut piece is added to the recursively calculated value of the remaining part of the rod. The maximum value obtained among all combinations is the desired result. + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Our Approach +As we can visualize from the example, there is an overlapping subproblem and an optimal sub-structure. So, we should opt for the DP approach. + +> **Note**: We can observe three things here: + 1. The maximum capacity is the length of the order. + 2. `A[i]` is storing the length of the piece of the rod. + 3. The sum of the length of each piece must be less than or equal to ``N`` +The general observation that we can get here from these three things is that it is a knapsack problem. + +--- +### Question +The cutting rod question is: + +**Choices** +- [ ] Fractional Knapsack +- [ ] `0-1` Knapsack +- [x] Unbounded Knapsack (or `0-N` Knapsack) + +--- +### Cut the rod for maximum profit Approach + +#### Approach +- First, define the state of the dp i.e. `dp[i]`, it will be the maximum value that can be received by the rod of length `i`. +- The base case will be 0 in the case when the length of the rod is 0. This means `dp[0] = 0`. + +We will loop over the array, and then calculate the maximum profit, and finally store the maximum profit in the current dp state. + +Let us now see the pseudo-code for the problem. + +#### Pseudocode +```cpp +for all values of i: dp[i] = 0 + +for (i = 1 to N) // length of rod to sell = i +{ + for (j = 1 to i) { + dp[i] = max(dp[i], A[j] + dp[i - j]) + } +} +return dp[N] +``` + +#### Time and Space Complexity +- **Time Complexity**: $O(N^2)$, as we are traversing the N-length array using nested for loops (Simply, we can also say that the capacity is `N` and the length of the array is also `N`). +- **Space Complexity**: `O(N)`, as we are using an extra dp array to store the current state of profit. + + +--- +### Problem 2 Count the number of ways using coins (ordered selection) + + +In how many ways can the sum be equal to ``N`` by using coins given in the array? One coin can be used multiple times. + +**Example** +There are 2 ways to solve this problem +a. **Ordered selection of coin** + +Let us create the set of numbers that cummulate the value of `N`. + + + +So, we can see that we have the value we get is $6$. + +Now, let's look at the selection tree of the coin selection. We can divide the number by selecting the choices of subraction. + + + + +#### Solution - Ordered Selection of Coin +The naive approach to solving this problem involves using a recursive approach with backtracking. For each coin value in the array, subtract it from the target sum N, and recursively find the number of ways to form the remaining sum using the same coin set. Repeat this process for all coins and sum up the results. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach +As we can observe from the examples above, we have to calculate the number of ways of selection, it is similar to the unbounded knapsack problem (as one coin can be selected multiple times). + +--- +### Question +What is the number of ways to get `sum = 0` + +**Choices** +- [ ] 0 +- [x] 1 +- [ ] 2 +- [ ] Undefined + +--- +### Count the number of ways using coins Pseudocode +#### Pseudocode +```cpp +for all values of i: dp[i] = 0 +dp[0] = 1 + +for (i = 1 to N) { + for (j = 1 to(A.length - 1)) { + if (A[j] <= i) { + dp[i] += dp[i - A[j]] + } + } +} + +return dp[N] +``` + + +#### Time and Space Complexity +- **Time Complexity**: $O(N * (length~ of ~the ~array))$. +- **Space Complexity**: $O(N)$. + +--- +### Problem 3 Count the number of ways using coins (un-ordered selection) + + +Given a set of coins and a target sum, find the number of ways to make the target sum using the coins, where each coin can only be used once. + +**Example** + +Suppose we have a situation same as the last one. +N = 5 and coins we have [3, 1, 4]. + +So here we have 3 possible ways. + +Now, let us try to arrage the coins to get the desired value. + + + +So, what we can observe out of it is: +- The current state of dp, i.e. `dp[i]` is to select the number of ways to get the sum equal to i by selecting coins from L to R in the array. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Solution: Un-ordered Selection of Coin +How we can solve it: +- Initialize an array dp with all values set to 0. This array will be used to store the number of ways to make change for each possible sum from 0 to N. +- Set the initial value of `dp[0]` to 1. This step indicates that there is one way to make change for an amount of 0, which is by not using any coins. +- Iterate through the different coin denominations represented by the array A. This loop will consider each coin one by one. +- For each coin denomination `A[j]`, iterate through the possible sums from 1 to N. This loop will consider each sum value from 1 to N and calculate the number of ways to make change for that sum. +- Inside the inner loop, check if the current coin denomination `A[j]` is less than or equal to the current sum `i`. If it is, then it's possible to use this coin to make change for the current sum. +- If the condition is met, update the `dp` array for the current sum i by adding the number of ways to make change for the remaining amount (`i - A[j]`). This is where dynamic programming comes into play, as you are building up the solutions for larger sums based on the solutions for smaller sums. +- After both loops complete, the `dp[N]` value will represent the number of ways to make change for the desired amount N using the given coin denominations. +- Finally, return the value stored in `dp[N]`. + + +#### Pseudocode +```cpp +for all values of i: dp[i] = 0 +dp[0] = 1 + +for (j = 0 to(A.length - 1)) // coins +{ + for (i = 1 to N) // sum + { + if (A[j] <= i) { + dp[i] += dp[i - A[j]] + } + } +} + +return dp[N] +``` + + +#### Time and Space Complexity +- **Time Complexity**: $O(N * (length~ of~ the~ array))$. +- **Space Complexity**: `O(N)`. + + + +--- +### Problem 4 Extended 0-1 Knapsack Problem + +We are given `N` toys with their happiness and weight. Find max total happiness that can be kept in a bag with the capacity `W`. Here, we cannot divide the toys. + +The constraints are: +$- 1 <= N <= 500$ +$- 1 <= h[i] <= 50$ +$- 1 <= wt[i] <= 10^9$ +$- 1 <= W <= 10^9$ + + +--- +### Question +What is the MAX value we can get for these items i.e. (weight, value) pairs in 0-1 knapsack of capacity W = 8. +Items = [(3, 12), (6, 20), (5, 15), (2, 6), (4, 10)] + +Chose the correct answer + + +**Choices** +- [x] 27 +- [ ] 28 +- [ ] 29 +- [ ] 30 + +**Explanation** + +Simple 0-1 Knapsack, after trying all combinations 27 is the highest value we can have inside the knapsack. + +--- +### Extended 0-1 Knapsack Problem Approach and Explanation + +#### Approach and Calculations + + + +The normal approach to solve this problem would involve using a recursive or iterative algorithm to consider all possible combinations of toys and select the one with the maximum happiness that doesn't exceed the weight limit. However, due to the constraints provided (N up to 500, `wt[i]` up to $10^9$, ``W`` up to $10^9$), this approach would be extremely slow and inefficient. + +By employing dynamic programming, we can optimize the solution significantly. The DP approach allows us to break down the problem into subproblems and store the results of these subproblems in a table to avoid redundant calculations. In this case, we can use a 2-D DP table where `dp[i][w]` represents the maximum happiness that can be achieved with the first `i` toys and a weight constraint of `w`. + +DP offers a much faster solution, as it reduces the time complexity from exponential to polynomial time, making it suitable for large inputs like those in the given constraints. Therefore, opting for a DP approach is essential to meet the time and pace constraints of this problem. diff --git a/Academy DSA Typed Notes/Advanced/DSA Graphs 1 Introduction, DFS & Cycle Detection.md b/Academy DSA Typed Notes/Advanced/DSA Graphs 1 Introduction, DFS & Cycle Detection.md new file mode 100644 index 0000000..0b5fa6d --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Graphs 1 Introduction, DFS & Cycle Detection.md @@ -0,0 +1,499 @@ +# Graphs 1: Introduction with BFS & DFS + +--- +## Graphs Introduction + +### Introduction + +**Graph**: It is a collection of nodes and edges. + +Some real life examples of Graph - +1. Network of computers +2. A Website +3. Google Maps +4. Social Media + + + + + + + + +--- +### Types of Graph + + +### Cyclic Graph + +A cyclic graph contains at least one cycle, which is a closed path that returns to the same vertex. +Diagram: +```javascript +A -- B +| | +| | +D -- C +``` + +### Acyclic Graph +An acyclic graph has no cycles, meaning there are no closed paths in the graph. +Diagram: +```javascript +A -- B +| | +D C +``` + +### Directed Graph (Digraph) +In a directed graph, edges have a direction, indicating one-way relationships between vertices. +Diagram: +```javascript +A --> B +| | +v v +D --> C +``` + +### Undirected Graph +In an undirected graph, edges have no direction, representing symmetric relationships between vertices. +Diagram: +```javascript +A -- B +| | +| | +D -- C +``` + +### Connected Graph +A connected graph has a path between every pair of vertices, ensuring no isolated vertices. +Diagram +```javascript +A -- B +| +D -- C +``` + +### Disconnected Graph +A disconnected graph has at least two disconnected components, meaning there is no path between them. +Diagram: +```javascript +A -- B C -- D +| | +E -- F G -- H +``` + +### Weighted Graph +In a weighted graph, edges have associated weights or costs, often used to represent distances, costs, or other metrics. +Diagram (Undirected with Weights): +```javascript +A -2- B +| | +1 3 +| | +D -4- C +``` + +### Unweighted Graph +An unweighted graph has no associated weights on its edges. +Diagram (Undirected Unweighted): +```javascript +A -- B +| +D -- C +``` + +### Degree of a Vertex +The degree of a vertex is the number of edges incident to it. +Diagram: +```javascript + B + | +A--C--D +``` + +### Outdegree of a Vertex +The outdegree of a vertex in a directed graph is the number of edges leaving that vertex. +Diagram: +```javascript +A --> B +| | +v v +D --> C +``` + +### Simple Graph +A simple graph has no self-loops or multiple edges between the same pair of vertices. +Diagram: +```javascript +A -- B +| +D -- C +``` + + + +--- +### How to store a graph + + +### Graph: + + + +### Adjacency Matrix: +All the edges in above graph has equal weights. +In adjacency matrix, `mat[i][j] = 1`, if there is an edge between them else it will be 0. + + + + + +#### Pseudocode: + +```cpp +int N, M +int mat[N+1][M+1] = {0} + +for(int i=0; i < A.size(); i++) { + u = A[i][0]; + v = A[i][1]; + + mat[u][v] = 1 + mat[v][u] = 1 +} +``` + +Note: In case of weighted graph, we store weights in the matrix. + +**Advantage:** Easy to update new edges. + +**Disadvantage:** Space wastage because of also leaving space for non-exitent edges. +Moreover, +If N<=10^5, it won't be possible to create matrix of size 10^10. +It is possible only if N <= 10^3 + + +**Space Complexity:** O(N^2^) + +### 2. Adjacency List: + +An adjacency list is a common way to represent a graph in computer science. It's used to describe which nodes (or vertices) in the graph are connected to each other. Here's how it works: + +#### Graph: + + + +#### Adjacency List: + +Stores the list of nodes connected corresponding to every node. + + +We can create map of or an array of lists +``` +map> graph; + +OR + +list graph[] +``` + +#### Pseudocode: +```javascript +int N +int M +list < int > graph[N + 1] +for (int i = 0; i < A.size(); i++) { + u = A[i][0] + v = A[i][1] + + graph[u].add(v) + graph[v].add(u) +} +``` + +* We refer the adjacent nodes as **neighbours**. + +--- +### Question + +Consider a graph contains V vertices and E edges. What is the **Space Complexity** of adjacency list? + +**Choices** + +- [ ] O(V^2) +- [ ] O(E^2) +- [x] O(V + E) +- [ ] O(V*E) + + + +Space is defined by the edges we store. An Edge e comprise of two nodes, a & b. For a, we store b and for b, we store a. Hence, 2 * E. + +Now, we are doing this for every node, hence +V. + +Space Complexity: O(V+E) + + +--- +### Graph traversal algorithm - DFS + + +There are two traversal algorithms - DFS (Depth First Search) and BFS(Breadth First Search). + +In this session, we shall learn DFS and in next, BFS. + +### DFS +Depth-First Search (DFS) is a graph traversal algorithm used to explore all the vertices and edges of a graph systematically. It dives deep into a graph as far as possible before backtracking, hence the name "Depth-First." Here's a basic explanation of the DFS process with an example: + +### Process of DFS: +1. **Start at a Vertex:** Choose a starting vertex (Any). +2. **Visit and Mark:** Visit the starting vertex and mark it as visited. +3. **Explore Unvisited Neighbors:** From the current vertex, choose an unvisited adjacent vertex, visit, and mark it. +4. **Recursion:** Repeat step 3 recursively for each adjacent vertex. +5. **Backtrack:** If no unvisited adjacent vertices are found, backtrack to the previous vertex and repeat. +6. **Complete When All Visited:** The process ends when all vertices reachable from the starting vertex have been visited. + + + +### Example/Dry-run: + +Consider a graph with vertices A, B, C, D, E connected as follows: + +``` +A ------ B +| | +| | +| | +C D +\ + \ + \ + \ + E +``` + +**DFS Traversal:** + +* Start at A: Visit A. +* Visit Unvisited Neighbors of A: + * Go to B (unvisited neighbor of A). + * Visit B. +* Visit Unvisited Neighbors of B: + * Go to D (unvisited neighbor of B). + * Visit D. +* Backtrack to B: Since no more unvisited neighbors of D. +* Backtrack to A: Since no more unvisited neighbors of B. +* Visit Unvisited Neighbors of A: + * Go to C (unvisited neighbor of A). + * Visit C. +* Visit Unvisited Neighbors of C: + * Go to E (unvisited neighbor of C). + * Visit E. +* End of DFS: All vertices reachable from A have been visited. + +**DFS Order:** +The order of traversal would be: **A → B → D → C → E**. + + +#### Pseudocode: + +We'll take a visited array to mark the visited nodes. + +```javascript +// Depth-First Search function +int maxN = 10 ^ 5 + 1 +list < int > graph[maxN]; +bool visited[maxN]; + +void dfs(int currentNode) { + // Mark the current node as visited + visited[currentNode] = true; + + // Iterate through the neighbors of the current node + for (int i = 0; i < graph[currentNode].size(); i++) { + int neighbor = graph[u][i]; + // If the neighbor is not visited, recursively visit it + + if (!visited[neighbor]) { + dfs(neighbor); + } + } +} +``` + +> + +--- +### Question +Time Complexity for DFS? + +**Choices** +- [x] O(V + E) +- [ ] O(V) +- [ ] O(2E) + +**Explanation**: + +The time complexity of the DFS algorithm is O(V + E), where V is the number of vertices (nodes) in the graph, and E is the number of edges. This is because, in the worst case, the algorithm visits each vertex once and each edge once. + +**Space Complexity:** O(V) + + +--- +### Problem 1 Detecting Cycles in a Directed Graph + +Check if given graph has a cycle? + +**Examples** + +1) + + +2) + + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach + +Apply DFS, if a node in current path is encountered again, it means cycle is present! +With this, we will have to keep track of the path. + +Example 1: + + +>Say we start at 0 -> 1 -> 3 +path[] = {0, 1, 3} +Now, while coming back from 3, we can remove the 3 from path array. +path[] = {0, 1} +Now, 0 -> 1 -> 2 -> 3 +path[] = {0, 1, 2, 3} ***[Here, we came back to 3, but via different path, which is not an issue for us]*** + +Example 2: + + +> Say we start at 0 -> 1 -> 2 -> 3 +path[] = {0, 1, 2, 3} +Now, from 3, we come back to 1. +path[] = {0, 1, 2, 3, 1} ***[But 1 is already a part of that path, which means cycle is present]*** + +#### Pseudocode + +```javascript +list < int > graph[] //filled +bool visited[] = {0} +int path[N] = {0} + +bool dfs(int u) { + visited[u] = true + path[u] = 1 + + for (int i = 0; i < graph[u].size(); i++) { + int v = graph[u][i] + if (path[v] == 1) return true + else if (!visited[v] && dfs(v)) { + return true + } + } + path[u] = 0; + return false; +} +``` + +#### Complexity +**Time Complexity:** O(V + E) +**Space Complexity:** O(V) + + + +--- +### Problem 2 Number of Islands Statement and Approach + + +You are given a 2D grid of '1's (land) and '0's (water). Your task is to determine the number of islands in the grid. An island is formed by connecting adjacent (horizontally or vertically) land cells. Diagonal connections are not considered. + +Given here if the cell values has 1 then there is land and 0 if it is water, and you may assume all four edges of the grid are all surrounded by water. + + + +In this case we can see that our answer is 5. + +**Que: Do we need adjacency list ?** +Ans: No, since the information is already present in form of matrix which can be utilised as it is. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach: + +**Set a Counter:** Start with a counter at zero for tracking island count. + +**Scan the Grid:** Go through each cell in the grid. + +**Search for Islands:** When you find a land cell ('1'), use either BFS or DFS to explore all connected land cells. + +**Mark Visited Cells:** Change each visited '1' to '0' during the search to avoid recounting. + +**Count Each Island:** Increase the counter by 1 for every complete search that identifies a new island. + +**Finish the Search:** Continue until all grid cells are checked. + +**Result:** The counter will indicate the total number of islands. + + +--- +### Number of Islands Dry Run and Pseudocode + +#### Dry-Run: +```java +[ + ['1', '1', '0', '0', '0'], + ['1', '1', '0', '0', '0'], + ['0', '0', '0', '0', '0'], + ['0', '0', '0', '1', '1'] +] +``` + +* Initialize variable islands = 0. +* Start iterating through the grid: +* At grid[0][0], we find '1'. Increment islands to 1 and call visitIsland(grid, 0, 0). +* visitIsland will mark all connected land cells as '0', and we explore the neighboring cells recursively. After this, the grid becomes: + + +```cpp- +[ + ['0', '0', '0', '0', '0'], + ['0', '0', '0', '0', '0'], + ['0', '0', '1', '0', '0'], + ['0', '0', '0', '1', '1'] +] +``` +* Continue iterating through the grid: +* At grid[2][2], we find '1'. Increment islands to 2 and call visitIsland(grid, 2, 2). +* visitIsland will mark connected land cells as '0', and we explore the neighboring cells recursively. After this, the grid becomes: +```java +[ + ['0', '0', '0', '0', '0'], + ['0', '0', '0', '0', '0'], + ['0', '0', '0', '0', '0'], + ['0', '0', '0', '1', '1'] +] +``` +* Continue the iteration. +* At grid[3][3], we find '1'. Increment islands to 3 and call visitIsland(grid, 3, 3). + +We can visit only 4 coordinates, considering them to be i, j; it means we can visit **(i,j-1), (i-1, j), (i, j+1), (i+1, j)** + + + +#### Pseudocode + + + + + + diff --git a/Academy DSA Typed Notes/Advanced/DSA Graphs 2 BFS, Matrix Questions & Topological Sort.md b/Academy DSA Typed Notes/Advanced/DSA Graphs 2 BFS, Matrix Questions & Topological Sort.md new file mode 100644 index 0000000..b14c1a7 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Graphs 2 BFS, Matrix Questions & Topological Sort.md @@ -0,0 +1,417 @@ +# DSA: Graphs 2: BFS, Matrix Questions & Topological Sort + +--- +## BFS +Breadth-First Search (BFS) is another graph traversal algorithm used to explore and navigate graphs or trees. It starts at a source node and explores all its neighbors at the current depth level before moving on to the next level. BFS uses a queue data structure to maintain the order of nodes to be visited. + +### Approach: +* We use a queue to maintain the order of nodes to visit in a breadth-first manner. +* We start with a vector visited to keep track of whether each node has been visited. Initially, all nodes are marked as unvisited (false). +* We enqueue the startNode into the queue and mark it as visited. +* We enter a loop that continues until the queue is empty. +* In each iteration, we dequeue the front element (the current node) from the queue and process it. Processing can include printing the node or performing any other desired operation. +* We then iterate through the neighbors of the current node. For each neighbor that hasn't been visited, we enqueue it into the queue and mark it as visited. +* The BFS traversal continues until the queue is empty, visiting nodes level by level. + + +### Example/Dry-Run +```javascript + A --- B --- C + | | + +---------+ + | + D +``` +Suppose in this if we want to perform BFS then: + +* Start from the source node (City A). +* Explore neighboring nodes level by level. +* Use a queue to maintain the order. +* Mark visited nodes (using adjaency list) to avoid repetition. +* Stop when the target node (City D) is reached. +* This guarantees the shortest path in unweighted graphs. + + +#### Pseudocode: +```javascript +void bfs(int startNode) { + vector < bool > visited(MAX_NODES, false); // Initialize all nodes as unvisited + queue < int > q; + + q.push(startNode); // Enqueue the start node + visited[startNode] = true; // Mark the start node as visited + + while (!q.empty()) { + int currentNode = q.front(); + q.pop(); + + // Process the current node (e.g., print or perform an operation) + + for (int neighbor: graph[currentNode]) { + if (!visited[neighbor]) { + q.push(neighbor); // Enqueue unvisited neighbors + visited[neighbor] = true; // Mark neighbor as visited + } + } + } +``` + +#### Compexity +**Time Complexity:** O(V + E) +**Space Complexity:** O(V) + + +--- +### Question + +Consider a graph with the following adjacency matrix: + +``` +[0, 1, 1, 0] +[1, 0, 0, 0] +[1, 0, 0, 1] +[0, 0, 1, 0] +``` + +What is the order in which the nodes will be visited when performing a breadth-first search (BFS) starting from node 0? + +**Choices** +- [x] 0, 1, 2, 3 +- [ ] 0, 1, 3, 2 +- [ ] 0, 2, 3, 1 +- [ ] 0, 1, 3, 1 + + +The correct answer is (a) 0, 1, 2, 3. + +BFS (Breadth-First Search) explores neighbor nodes first before moving to the next level. Starting from node 0, BFS visits its neighbors 1 and 2. It then moves to the next level and visits 1's neighbor 3. Finally, it moves to the next level but finds no more unvisited nodes. Therefore, the order of BFS traversal is 0, 1, 2, 3. + +--- +### Multisource BFS + +There are N number of nodes and multisource(S1,S2,S3), we need to find the length of shortest path for given destination node to any one of the source node{S1,S2,S3}. + + + + +#### Solution +Length = 2 +In the beginning, we need to push all source node at once and apply exact BFS,then return the distance of destination node. +#### Time and Space Complexity +* **TC -** O(N+E) +* **SC -** O(N+E) + +--- +### Rotten Oranges + +There is given a matrix and there are 3 values where 0 means empty cell, 1 means fresh orange present and 2 means rotten orange prsent, we need to find the time when all oranges will become rotten. +**Note:** If not possible, return - 1. + + + + + +#### Solution + + + + + +**Answer:** after 3 minutes all oranges will get rotten. +* Initially, We need to insert all rotten oranges in Queue (where each element in queue is in a pair), +* Then check if any fresh oranges has become rotten and if they did, return the time otherwise return -1. + +#### Pseudocode +```java +public class RottingOranges { + private static final int[] dx = {-1, 1, 0, 0}; + private static final int[] dy = {0, 0, -1, 1}; + + public int orangesRotting(int[][] grid) { + int rowCount = grid.length; + int colCount = grid[0].length; + Queue< int[] > queue = new LinkedList< >(); + int freshOranges = 0; + int minutes = 0; + + // Count fresh oranges and add rotten oranges to the queue + for (int i = 0; i < rowCount; i++) { + for (int j = 0; j < colCount; j++) { + if (grid[i][j] == 2) { + queue.offer(new int[]{i, j, minutes}); + } else if (grid[i][j] == 1) { + freshOranges++; + } + } + } + if (freshOranges == 0) { + // If there are no fresh oranges initially, they are already rotten. + return 0; + } + + while (!queue.isEmpty()) { + int[] cell = queue.poll(); + int x = cell[0]; + int y = cell[1]; + minutes = cell[2]; + + for (int i = 0; i < 4; i++) { + int newX = x + dx[i]; + int newY = y + dy[i]; + + if (isValid(grid, newX, newY) && grid[newX][newY] == 1) { + grid[newX][newY] = 2; + freshOranges--; + queue.offer(new int[] {newX, newY, minutes + 1}); + } + } + } + + return (freshOranges == 0) ? minutes : -1; + } + private boolean isValid(int[][] grid, int x, int y) { + int rowCount = grid.length; + int colCount = grid[0].length; + return x >= 0 && x < rowCount && y >= 0 && y < colCount; + } + + +``` + +--- +### Possibility of finishing the courses + + +Given N courses with pre-requisites, we have to check if it is possible to finish all the course ? + +**Example:** + +N = 5 + +**Pre-requisites** +1 ---> 2 & 3 [1 is pre-req for 2 and 3] +2 ---> 3 & 5 +3 ---> 4 +4 ---> 2 + + + +The pre-req information is represented in above directed graph. + + +#### Explanantion: + +**Que:** Which course shall we complete first? +The one having no pre-requisites. (say 1) + + + +Next, which one shall we pick ? + +We can't pick any course because of the dependencies. Hence, it means we can't finish courses in above example. + +The reason is there's a cycle! +Have you heard of the term deadlock ? [*For experience we need job, for job we need experience like scenario :p* ] + +**Conclusion:** If it's a cyclic graph, answer will always be false, else true. + +**Observation:** To solve the problem, we need directed acyclic graph! + +--- +### Possibility of finishing courses approach + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Example:** + + + +Pick ? 1 [not dependant on any other course] +Next Pick ? 2 +Next Pick ? 3 +Next Pick ? 4 +Next Pick ? 5 + +**Order:** +1 2 3 4 5 + +The above order is known as topological sort/ topological order. + +**Que:** For one graph, can we have only one topological order? + + + +Is the order 1 2 3 4 5 valid ? YES! +What about 1 3 2 4 5 ? YES! +What about 1 3 4 2 5 ? YES! + +Hence, it is possible that we have multiple topological order for a given graph. + +#### Definition + +**Topological sort** is a linear ordering of the vertices (nodes) in a directed acyclic graph (DAG) such that for every directed edge (u, v), vertex u comes before vertex v in the ordering. In other words, it arranges the nodes in such a way that if there is a directed edge from node A to node B, then node A comes before node B in the sorted order. + +--- +## Topological Sort + +Let's find topological ordering of below graph! + + + +**Indegree:** The count of incoming nodes is known as indegree of a node. + +For above graph, the indegrees will be as follows - + + + +### Next Steps +* Insert all the nodes with indegree=0 in a queue +* Dequeue an element from the queue and update the indegree for all the neighbours, if the indegree for any nbr becomes 0 add that node in the queue. + + + +### Approach: +* Create an array to store indegrees, initially set all values to zero. +* Iterate through each node in the graph using a loop. +* For each node, traverse its outgoing edges by iterating through its adjacency list. +* For each neighboring node in the adjacency list, increment its indegree count by one. +* Continue the loop until you've processed all nodes in the graph. +* The array now contains the indegree of each node, where the value at index i represents the indegree of node i. + +**Example:** + + + +In the above photo we can refer the indegree of each of the nodes is written in green. + +#### Pseudocode: +```java +in [N], i, in [i] = 0; +for (i = 0; i < n; i++) { + for (nbr: adj[i]) { + ibr[i] += 1; + } +} +``` +#### Complexity +**Time Complexity:** O(N + E) +**Space Complexity:** 0(N) + +--- +### Topological Sort (Right to Left) + + + +In a right-to-left topological order, you start from the "rightmost" vertex (i.e., a vertex with no outgoing edges) and proceed leftward. This approach can be useful in certain situations and can be thought of as a reverse topological ordering. + +Here's how you can approach it: + +#### Approach: +* Identify a vertex with no outgoing edges (in-degree = 0). If there are multiple such vertices, you can choose any of them. +* Remove that vertex from the graph along with all its outgoing edges. This removal may affect the in-degrees of other vertices. +* Repeat steps 1 and 2 until all vertices are removed from the graph. The order in which you remove the vertices constitutes the right-to-left topological order. + +#### Example/Dry-Run: +```java +A -> B -> C +| | +v v +D E +``` +To find the right-to-left topological order: + +* Start with a vertex with no outgoing edges. In this case, you can start with vertex C. +* Remove vertex C and its outgoing edge. The graph becomes: +```java +A -> B +| +v +D E +``` +Now, you can choose either B or E, both of which have no outgoing edges. Let's choose B and remove it: +```java +A +| +v +D E +``` +* Continue with the remaining vertices. Choose A next: +```java +| +v +D E +``` +* Finally, remove D and E: +```java +| +v +| | +``` +The order in which you removed the vertices is a right-to-left topological order: C, B, A, D, E. + +#### Pseudocode +```java +function topologicalSortRightToLeft(graph): + // Function to perform DFS and record nodes in the order they are finished + function dfs(node): + mark node as visited + for each neighbor in graph[node]: + if neighbor is not visited: + dfs(neighbor) + append node to order list + + create an empty order list + initialize a visited array with False for all nodes + + for each node in the graph: + if node is not visited: + dfs(node) + + reverse the order list + + return the reversed order list as the topological order (right-to-left) +``` + +#### Complexity +**Time Complexity:** O(V+E) +**Space Complexity:** O(V) + +--- +### Question +Which of the following is correct topological order for this graph? + + + +**Choices** +- [x] TD,TA,TC,TB +- [ ] TA,TD,TC,TB +- [ ] TC,TA,TD,TB + +--- +### Another approach to BFS + + +Find the minimum number of edges to reach v starting from u in undirected simple graph. + +**Graph:** + + + + +#### Approach + +Imagine you're playing a game where you have to find the quickest way from point A (vertex u) to point B (vertex v) in a giant maze. This is similar to using Breadth-First Search (BFS) in a graph. + +**Think of BFS as your strategy for exploring the maze:** + +**Start at Point A:** You're at the entrance of the maze (vertex u), ready to find the shortest path to the treasure (vertex v). + +**Explore Closest Paths First:** Just like deciding which paths to take in the maze, BFS first checks all the paths that are one step away from your current position, then moves to paths two steps away, and so on. + +**Layer by Layer:** It's like a ripple effect in a pond. You throw a stone (start at vertex u), and the ripples (paths) expand outward, reaching further away points one layer at a time. + +**Reaching Point B:** As you follow this method, the moment you step on point B (vertex v) in the maze, you know you've found the shortest route. In BFS, when you first reach vertex v, it guarantees the minimum steps taken, just like finding the quickest path out of the maze. + +So, by using BFS in our maze game (or graph), we ensure we're taking the most efficient route possible, avoiding any long detours or dead-ends. It's a smart and systematic way to reach our goal with the least amount of hassle! diff --git a/Academy DSA Typed Notes/Advanced/DSA Graphs 3 MST (Prims Algo.) & Dijkstra Algo.md b/Academy DSA Typed Notes/Advanced/DSA Graphs 3 MST (Prims Algo.) & Dijkstra Algo.md new file mode 100644 index 0000000..090f695 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Graphs 3 MST (Prims Algo.) & Dijkstra Algo.md @@ -0,0 +1,239 @@ +# Graphs 3: MST & Dijkstra + +--- +### Challenges in Flipkart's Logistics and Delivery + + +**Scenario:** +Suppose Flipkart has N local distribution centers spread across a large metropolitan city. These centers need to be interconnected for efficient movement of goods. However, building and maintaining roads between these centers is costly. Flipkart's goal is to minimize these costs while ensuring every center is connected and operational. + +**Goal:** You are given number of centers and possible connections that can be made with their cost. Find minimum cost of constructing roads between centers such that it is possible to travel from one center to any other via roads. + + + +**Explanation** + +**Example:** + + + + + +**Output:** + + + + +### Idea: + +To achieve the lowest cost in our scenario, consider these key points: + +1. **Aim for Fewer roads:** Minimizing the number of roads directly leads to reduced costs. + +2. **Opt for a Tree Structure:** Why a tree? Well, in the world of data structures, a tree uniquely stands out when it comes to minimal connections. For any given N nodes, a tree is the only structure that connects all nodes with exactly N - 1 edges. This is precisely what we need - the bare minimum of edges to connect all points, ensuring the lowest possible number of roads. + + +**Another Example:** + + + +The end goal is that all centers should be connected. + +**Possible Solutions -** + + + +Here first is better because the sum of all edge weights is minimum. + +The tree which spans (covers) all the vertices with the minimum number of edges needed to connect them is known as **Spanning Tree**. + +### Minimum Spanning Tree + +The minimum spanning tree has all the properties of a spanning tree with an added constraint of having the minimum possible weights among all possible spanning trees. + +**Uniqueness of MST:** If all edge weights are unique, there's only one MST. If some weights are the same, multiple MSTs can exist. + +**Algorithms for MST:** Kruskal's and Prim's algorithms are used to find MSTs. The MST found can vary based on the choices made for edges with equal weights. Both algorithms solve for same problem having same time and space complexities. + + +### Solution to Flipkart's problem + +**Application of MST:** +* **Identify All Possible Connections:** First, identify all the possible routes that can connect these N centers. Imagine this as a network where each center is a node, and each possible road between two centers is an edge. + +* **Assign Costs:** Assign a cost to each potential road, based on factors like distance, traffic, or construction expenses. In real-life terms, shorter and more straightforward routes would generally cost less. + +* **Create the MST:** Now, apply the MST algorithm (like Kruskal's or Prim's). The algorithm will select routes that connect all the centers with the least total cost, without forming any loops or cycles. + +* **Outcome:** The result is a network of roads connecting all centers with the shortest total length or the lowest cost. + +--- +## Prim's Algorithm + + +Let's consider the below **Graph:** + + + +Say we start with **vertex 5**, now we can choose an edge originating out of 5. + + + +*Which one should we choose?* +The one with minimum weight. + +We choose 5 ---- 3 with weight 2 + + + +Now, after this, since 5 and 3 are part of the MST, we shall choose a min weighted edge originated from either 3 or 5. That edge should connect to a vertex which hasn't been visited yet. + + + +We choose 5 ---- 4 with weight 3 + + + +Now, same process follows i.e, we can select a min weighted edge originating from 3, 4, or 5 such that it should connect to a vertex that hasn't been visited yet. + + +**After completing the entire process, we shall have below MST.** + + + + +### Execution + +Say we have a black box(we'll name it later) + +Now, say we start with 5. From 5, via weight 3 we can visit 4, via weight 5 we can visit 6, via weight 2 we can visit 3. + +We'll information as - (weight, vertex) + + + +From this, we'll get vertex reachable via min weight, which data structure can be helpful ? +**MIN HEAPS** + +Now, we remove (2, 3) from heaps and connect 3 to 5. + +From 3, the nodes that are reachable will be pushed to the heap. +*We'll insert only those vertices which haven't been visited yet.* + + + +Select the minimum weighted -> (3, 4) + +Now, this shall continue. + + +#### Pseudocode + +```java +while (!heap.isEmpty()) { + + Pair p = heap.getMin(); + + if (vis[v] == true) + continue; + + // Add the vertex to the MST and accumulate the weight + vis[v] = true; + ans += p.first + + // Now, you can optionally iterate through the adjacent vertices of 'v' and update the heap with new edges + for ((u, w) in adj[v]) { + + if (!vis[u]) { + // Add the unvisited neighbor edges to the heap + heap.add({w,u}); + } + } +} +``` + +#### Complexity +**Time Complexity:** O(E * logE) +**Space Complexity:** O(V + E) + +--- +## Dijkstra’s Algorithm + + +There are N cities in a country, you are living in city-1. Find minimum distance to reach every other city from city-1. + +We need to return the answer in the form of array + + + +**Output:** + + + + +**Initialize Data Structures:** + +* Create an adjacency list (graph) to represent the cities and their distances. +* Initialize a distances list with infinity for all cities except city-1 (set to 0). +* Use a `Heap` (heap) to explore cities, starting with the pair (0, 0) (distance from city-1 is 0, and it's city-1 itself). The heap will contain ``. + +**Explore Cities:** + +* While heap is not empty: + * Pop the pair (dist, u) with the shortest known distance. + * If dist is greater than the known distance to the city u, skip it. + * Otherwise, update the distance and explore its neighbors. + +**Explore Neighbors:** + +* For each neighbor of city u in the graph: + * Calculate the distance from city-1 via city u. + * If this new distance is shorter, update it and add the pair (new_distance, v) to the heap, where v is the neighbor. + +**Termination:** + +* Continue until the heap is empty, exploring all cities. + +**Return Result:** +* The distances list now holds the minimum distances from city-1 to all other cities. + + + + +```java + while (!hp.isEmpty()) { + Pair rp = hp.poll(); // Extract the minimum element + + int d = rp.first; // Distance + int u = rp.second; // City + + // Skip if this distance is greater than the known distance + if (d > dist[u]) { + continue; + } + + // Explore neighbors of u and update distances + for ( /* Loop through neighbors */ ) { + int v = /* Neighbor city */ ; + int w = /* Weight to reach v from u */ ; + + // Calculate the new distance via u + int new_dist = dist[u] + w; + + // If the new distance is shorter, update dist and add to heap + if (new_dist < dist[v]) { + dist[v] = new_dist; + hp.add(new Pair(new_dist, v)); + } + } + } + } +``` + +* The time complexity of the Dijkstra's algorithm implementation with a min-heap of pairs is $O((E + V) * log(V))$, where E is the number of edges, V is the number of vertices (cities), and log(V) represents the complexity of heap operations. +* The space complexity of this implementation is O(V + E), where V is the space used to store the dist array (minimum distances) for all cities, and E is the space used to represent the graph (adjacency list). + +### Can Dijkstra's algorithm work on negative wieghts? + +Dijkstra's algorithm is not suitable for graphs with negative edge weights as it assumes non-negative weights to guarantee correct results. Negative weights can lead to unexpected behavior and incorrect shortest path calculations. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Greedy.md b/Academy DSA Typed Notes/Advanced/DSA Greedy.md new file mode 100644 index 0000000..a8835d4 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Greedy.md @@ -0,0 +1,841 @@ +# Advanced DSA: Greedy + +--- +## Introduction on Greedy + +The greedy approach deals with maximizing our profit and minimizing our loss. + + + +**Example 1:** +Suppose we want to buy an iPhone, and the price of an iPhone at Amazon is 1.3 lakhs, the price at Paytm at 1.2 lakhs and the price at Flipkart is 1.25 lakhs. +So we will buy an iPhone from Paytm as it has a minimum price. +Here we are considering only one factor i.e. the amount of an iphone. + +**Example 2:** + +Suppose we want to switch a company and we have three offer letters. The first company is given a 22 LPA offer, the second company is given a 25 LPA, and the third company is given a 28 LPA offer. + +So we are going to select 28 LPA offer company. Here we are again considering the money factor, we are not considering the factors: +- Job is remote +- Work culture +- Timings +- Growth + +But if 25 LPA company has other facilities better than 28 LPA offer company. 25 LPA company has flexible working hours, provides remote job and good work culture. Then we are going to choose 25 LPA offer company. + +If we involve only one factor then selection will become easier and if multiple factors are involved then the decision becomes a bit difficult. + +In this lecture, we are going to do questions which involve multiple factors. + + +--- +### Problem 1 Flipkart's Challenge in Effective Inventory Management + +In the recent expansion into grocery delivery, Flipkart faces a crucial challenge in effective inventory management. Each grocery item on the platform carries its own expiration date and profit margin, represented by arrays A[i] (expiration date for the ith item) and B[i] (profit margin for the ith item). To mitigate potential losses due to expiring items, Flipkart is seeking a strategic solution. The objective is to identify a method to strategically promote certain items, ensuring they are sold before their expiration date, thereby maximizing overall profit. Can you assist Flipkart in developing an innovative approach to optimize their grocery inventory and enhance profitability? + + +**A[i] -> expiration time for ith item** +**B[i] -> profit gained by ith item** + +Time starts with **T = 0**, and it takes 1 unit of time to sell one item and the item **can only be sold if T < A[i].** + +Sell items such that the sum of the **profit by items is maximized.** + +**Example** + +**`A[] = [3 1 3 2 3]`** +**`B[] = [6 5 3 1 9]`** +**`index: 0 1 2 3 4`** + + +### Idea 1 - Pick the highest profit item first + + +- We will first sell the item with the highest profit. + +Initially T = 0 + +- We have the maximum profit item at index 4, so will sell it and increment T by 1. + + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 4 | 9 | + +- Now the item at index 1 can't be sold as A[1] <= T. So we can not sell it. + + +- Now we will sell the item at 0 index. + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 4 | 9 | +| 2 | 0 | 6 | + + + +- Now the item at index 3 can't be sold as A[3] <= T. So we can not sell it. + + +- Now we will sell the item at 2 index. + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 4 | 9 | +| 2 | 0 | 6 | +| 3 | 2 | 3 | + +So we have a total profit: 18. + +:bulb: **`But we can have a better answer than this answer. Let us try one more combination of selling items.`** + +**`A[] = [3 1 3 2 3]`** +**`B[] = [6 5 3 1 9]`** +**`index: 0 1 2 3 4`** + +Initially T = 0 + +- We have sold the item at index 1 and increment T by 1. + + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 1 | 5 | + +- Now we have sold the item at index 4 and again increment T by 1. + + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 1 | 5 | +| 2 | 4 | 9 | + +- Now the item at index 3 can't be sold as A[3] <= T. So we can not sell it. + + +- Now have sold the item at 0 index. + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 1 | 5 | +| 2 | 4 | 9 | +| 3 | 0 | 6 | + + +- Now the item at index 2 can't be sold as A[2] <= T. So we can not sell it + +So we have a total profit 20. + +Here we are getting the total profit greater than the total profit of the previously sold combination of items. + +And we can achieve maximum profit 20. + +**The greedy approach is selecting the path by greedy approach, in greedy we will select one path based on some conditions by assuming that this path will give us the solution.** + + + + +--- +### Question + +What is the maximum profit we can achieve if we have two items with expiration time in A and profit in B: + +A = [1, 2] +B = [3, 1500] + +**Choices** + +- [ ] 3 +- [ ] 1500 +- [x] 1503 +- [ ] 0 + + + +**Explanation** + +A = [1, 2] +B = [3, 1500] + + + +Initially T = 0 + +- We have selected the item at index 9 and incremented T by 1. + + +|T|Item Index|Profit| +|-|-|-| +|1|0|3| + +- Now we have selected the item at index 1 and again increment T by 1. + + +|T|Item Index|Profit| +|-|-|-| +|1|0|3| +|2|1|1500| + +So we have a total profit 1503. + + +--- + + +### Solution - Effective Inventory Management + +- Pick the highest profit item first approach is not giving us the maximum profit, so it will not work. We have to think of another approach. + +#### Idea: Sell Everything + +Our approach is always towards selling all the items so that we can achieve maximum profit. + So our approach is to first sell the item with the minimum end time. + + For this, we have to sort the expiration time in ascending order. + +**Example:** + +A[] = [1, 3, 3, 3, 5, 5, 5, 8] +B[] = [5, 2, 7, 1, 4, 3, 8, 1] + + +Initially T = 0 + +- We can sell an item available at index 0, as A[0] = 1, and T < A[0] + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 0 | 5 | + +- We can sell an item available at index 1, as A[1] = 3, and T < A[1] + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 0 | 5 | +| 2 | 1 | 2 | + +- We can sell a item available at index 2, as A[2] = 3, and T < A[2] + + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 0 | 5 | +| 2 | 1 | 2 | +| 3 | 2 | 7 | + +- But we can not sell the item available at index 3, as A[3] = 3, and A[3] <= T, here the profit of the item at index 3 is 1, so we ignore it easily as it has very little profit. + +- We can sell a item available at index 4, as A[4] = 5, and T < A[4]. + + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 0 | 5 | +| 2 | 1 | 2 | +| 3 | 2 | 7 | +| 4 | 4 | 4 | + +- We can sell a item available at index 5, as A[5] = 5, and T < A[5]. + + +| T | Item Index | Profit | +|:---:|:---------:|:------:| +| 1 | 0 | 5 | +| 2 | 1 | 2 | +| 3 | 2 | 7 | +| 4 | 4 | 4 | +| 5 | 5 | 3 | + +- But we can not sell the item available at index 6, as A[6] = 5, and A[6] <= T. But we can say that we must have to select this item to get the maximum profit as it has the larger profit. But we are rejecting it. +- To select the item available at index 6, we have to remove one of the previously selected items. +- So we want to discard the item with the minimum profit among all the selected items. + + +| T | Item Index | Profit | +|:-----:|:---------:|:------:| +| 1 | 0 | 5 | +| ~~2~~ | ~~1~~ | ~~2~~ | +| 3 | 2 | 7 | +| 4 | 4 | 4 | +| 5 | 5 | 3 | +| 5 | 6 | 8 | + + + +- We can sell item available at index 7, as A[7] = 8, and T < A[7]. + + +|T|Item Index|Profit| +|-|-|-| +|1|0|5| +|~~2~~|~~1~~|~~2~~| +|3|2|7| +|4|4|4| +|5|5|3| +|5|6|8| +|6|7|1| + + +So we have a total profit 28. + + +**`At any point, if we weren't able to choose a item as T >= A[i] and realize we made a wrong choice before, we will get rid of the item with least profit we previously picked and choose the current one instead.`** + + +#### Approach + +The solution to this question is just like the team selection. We have to select the strongest player, if we have any player who is stronger than the player in our team, then we will remove the weaker player from the team and add that player to our team. + + +**Example**: Solving using min-heap + +| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +| -- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +|A[ ]| 1 | 3 | 3 | 3 | 5 | 5 | 5 | 8 | +|B[ ]| 5 | 2 | 7 | 1 | 4 | 3 | 8 | 1 | + + +**Solution** + +Initially **T = 0** and we have a empty min-heap. + + + +All the items are sorted in the ascending order of expiration time. + +- We can sell a item available at index 0, as A[0] = 1, so here T < A[0], so we will sell the item available at index 0 and add its profit in min-heap. + +**T = 1** + + + +- We can sell a item available at index 1, as A[1] = 3, so here T < A[1], so we will sell the item available at index 1 and add its profit in min-heap. + +**T = 2** + + + +- We can sell a item available at index 2, as A[2] = 3, so here T < A[2], so we will sell the item available at index 2 and add its profit in min-heap. + +**T = 3** + + + + +- But we can not sell the item available at index 3, as A[3] = 3, and A[3] <= T. Now we will check if we have taken any incorrect steps in the past. +- We check if we have any items in the heap with profit less than 1. So we have 2 minimum profit in the heap but 2 > 1, so it proves all our past decisions are correct. So we will skip the item available at index 3. + + +- We can sell a item available at index 4, as A[4] = 5, and T < A[4] and add its profit in min-heap. + +**T = 4** + + + +- We can sell a item available at index 5, as A[5] = 5, so here T < A[5] and add its profit in min-heap. + + +**T = 5** + + + +- But we can not sell the item available at index 6, as A[6] = 5, and A[6] <= T. Now we will check if we have made any incorrect decisions in the past. +- We have minimum profit 2 in the heap, so remove it from the heap and add the profit of the item available at index 6 in the heap. + +**T = 5** + + + + +- We can sell a item available at index 7, as A[7] = 8, so here T < A[7], so we will sell the item available at index 7 and add its profit in min-heap. + + +**T = 6** + + + +- Now we can find the answer by removing one-by-one elements from the heap and adding them to the answer. + +So we have final answer = $1 + 3 + 4 + 5 + 7 + 8 = 28$ + + +#### PseudoCode +```cpp +1. Sort them in increasing order of time. +2. Minheap heap: + T = 0 +for (i = 0; i < N; i++) { + if (T < A[i]) { + heap.insert(B[i]) + T++ + } else { + if (B[i] <= root of heap) -> ignore { + + } + else { + extractMin() + heap.insert(B[i]) + } + } +} +3. Remove all elements from the heap and add them to get the answer. +``` + +--- +### Question + +What is the time and space complexity of this question? + +**Choices** + +- [ ] TC: O(N), SC: O(N) +- [x] TC: O(NlogN), SC: O(N) +- [ ] TC: O(N$^2$), SC: O(N) +- [ ] TC: O(N$^2$) , SC: O(N$^2$) + + +--- +### Effective Inventory Management Complexity + +**Time Complexity** + +```cpp +1. Sort them in increasing order of time.-- -> NlogN +2. Minheap heap: + T = 0 +for (i = 0; i < N; i++) { + -- -> N + if (T < A[i]) { + heap.insert(B[i]) -- -> logN + T++ + } else { + if (B[i] <= root of heap) -> ignore { + + } + else { + extractMin() -- -> logN + heap.insert(B[i]) -- -> logN + } + } +} +3. Remove all elements from the heap and add them to get the answer. +``` + +So overall time complexity = O(NlogN) + O(NlogN) + +- **Time Complexity: O(NlogN)** +- **Space Complexity: O(N)** + + +--- +### Problem 2 Candy Distribution + +There are N students with their marks. The teacher has to give them candies such that +a) Every student should have at least one candy +b) Students with more marks than any of his/her neighbours have more candies than them. + +Find minimum candies to distribute. + + +**Example** +**Input:** [1, 5, 2, 1] +**Explanation:** First we will give 1 candy to all students. +|index|0|1|2|3| +|-|-|-|-|-| +|marks|1|5|2|1| +|candy|1|1|1|1| + +Index 1 student has marks greater than their neighbours. So it must have candies greater than his neighbors. + +|index|0|1|2|3| +|-|-|-|-|-| +|marks|1|5|2|1| +|candy|1|~~1~~ 2 |1|1| + +Index 2 student has marks greater than its right neighbour. So it must have candies greater than his right neighbour. + +|index|0|1|2|3| +|-|-|-|-|-| +|marks|1|5|2|1| +|candy|1|~~1~~ 2 |~~1~~ 2 |1| + +Now index 1 student again has marks greater than both neighbors but its candies are not greater than its right neighbor's candies. So it must have candies greater than his both neighbors. + +|index|0|1|2|3| +|-|-|-|-|-| +|marks|1|5|2|1| +|candy|1|~~1~~ ~~2~~ 3 |~~1~~ 2 |1| + +Now all the conditions of the question are satisfied, so total 7 candies are required to be distributed among students. + +**Output:** 7 + + +--- +### Question + +What is the minimum number of candies teacher has to use if the marks are: [4, 4, 4, 4, 4] + +**Choices** + +- [ ] 1 +- [x] 5 +- [ ] 10 +- [ ] 20 + + +**Explanation** + +[4, 4, 4, 4, 4] + +First, we will give 1 candy to all students. +|index|0|1|2|3|4| +|-|-|-|-|-|-| +|marks|4|4|4|4|4| +|candy|1|1|1|1|1| + +Now any student does not have marks greater than its neighbors. So our candy distribution is perfect. + +**So total 5 candies are required.** + + + +--- +### Candy Distribution Example + +**Example** + +**Input:** [8, 10, 6, 2] + + + +First, we will give 1 candy to all students. +|index|0|1|2|3| +|-|-|-|-|-| +|marks|8|10|6|2| +|candy|1|1|1|1| + +- Now student at index 2 has marks greater than its right neighbor, so it receive 2 candies. + +|index|0|1|2|3| +|-|-|-|-|-| +|marks|8|10|6|2| +|candy|1|1|~~1~~ 2|1| + +- Student at index 1 has marks greater than both neighbours, so it must candies greater than both neighbours. So it receives 3 candies. + +|index|0|1|2|3| +|-|-|-|-|-| +|marks|8|10|6|2| +|candy|1|~~1~~ 3|~~1~~ 2|1| + +So total 7 candies are required. + +**Output:** 7 + + +--- +### Question + +What is the minimum number of candies the teacher has to use if the marks are: [1, 6, 3, 1, 10, 12, 20, 5, 2] + +**Choices** + +- [ ] 15 +- [x] 19 +- [ ] 21 +- [ ] 20 + + +**Explanation** + +[1, 6, 3, 1, 10, 12, 20, 5, 2] + +First, we will give 1 candy to all students. +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | + +First, let us consider the left nighbor of all the indexes. + +- Now a student at index 1 has marks greater than its left neighbour, so it should receive at least 2 candies. + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:| --- | ------- | --- | --- | --- | --- | --- | --- | --- | +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | ~~1~~ 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | + +- Now student at index 2, and 3 does not have marks greater than their left neighbour. + +- Student at index 4 has marks greater than its left neighbour, so it should receive at least 2 candies. + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:| --- | ------- | --- | --- | ------- | --- | --- | --- | --- | +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | ~~1~~ 2 | 1 | 1 | ~~1~~ 2 | 1 | 1 | 1 | 1 | + +- Student at index 5 has marks greater than its left neighbour, so it should receive at least 3 candies. + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:| --- | ------- | --- | --- | ------- | ------- | --- | --- | --- | +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | ~~1~~ 2 | 1 | 1 | ~~1~~ 2 | ~~1~~ 3 | 1 | 1 | 1 | + +- Student at index 6 has marks greater than its left neighbour, so it should receive at least 4 candies. + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:| --- | ------- | --- | --- | ------- | ------- | ------- | --- | --- | +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | ~~1~~ 2 | 1 | 1 | ~~1~~ 2 | ~~1~~ 3 | ~~1~~ 4 | 1 | 1 | + +- Student at index 7 and index 8 does not have marks greater than their left neighbour. + +Now let us consider the right neighbour. + + +- Student at index 7 has marks greater than its right neighbour, so it should receive at least 2 candies. + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:| --- | ------- | --- | --- | ------- | ------- | ------- | ------- | --- | +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | ~~1~~ 2 | 1 | 1 | ~~1~~ 2 | ~~1~~ 3 | ~~1~~ 4 | ~~1~~ 2 | 1 | + +- Student at index 6 has marks greater than its right neighbour, so it should receive at least 3 candies but it has 4 candies already which is greater than its right neighbour candies, so it is fine. + +- Student at index 5, 4 and 3 do not have marks greater than their right neighbour. + +- Student at index 2 has marks greater than its right neighbour. So it receives at least 2 candies. + + +|index|0|1|2|3|4|5|6|7|8| +|-|-|-|-|-|-|-|-|-|-| +|marks|1|6|3|1|10|12|20|5|2| +|candy|1|~~1~~ 2|~~1~~ 2|1|~~1~~ 2|~~1~~ 3|~~1~~ 4|~~1~~ 2|1| + +- Student at index 1 has marks greater than its right neighbour. So it receives at least 3 candies. + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:| --- | ------------- | ------- | --- | ------- | ------- | ------- | ------- | --- | +| marks | 1 | 6 | 3 | 1 | 10 | 12 | 20 | 5 | 2 | +| candy | 1 | ~~1~~ ~~2~~ 3 | ~~1~~ 2 | 1 | ~~1~~ 2 | ~~1~~ 3 | ~~1~~ 4 | ~~1~~ 2 | 1 | + +- Student at index 0 does not have marks greater than its right neighbour. + +So a total 19 candies are required. + +**Output:** 19 + + +--- + +### Candy Distribution - Solution + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Step 1:** Assign 1 candy to all the students. +**Step 2:** For all the values of i, consider its left neighbour, if(A[i] > A[i - 1]) then C[i] > C[i - 1], means candy of ith index should be greater than (i-1)th index candy, so we will follow the greedy approach as we want to distribute a minimum number of candies, so we do `C[i] = C[i - 1] + 1` + +```cpp +if(A[i] > A[i - 1]){ + C[i] = C[i - 1] + 1 +} +``` + +**Step 3:** For all the values of i, consider its right neighbour, if(A[i] > A[i+1]) then C[i] > C[i + 1], means candy of ith index should be greater than (i+1)th index candy, so first we check it has candies greater than his right neighbour or not if not then we will follow the greedy approach as we want to distribute a minimum number of candies, then we do `C[i] = C[i + 1] + 1` + +```cpp +if(A[i] > A[i + 1]){ + if(C[i] < C[i + 1] + 1) + C[i] = C[i + 1] + 1 +} +``` + +#### PsuedoCode +```cpp +int C[N]; +for all i, C[i] = 1 +for (i = 1; i < N; i++) { + if (arr[i] > arr[i - 1]) { + C[i] = C[i - 1] + 1 + } +} +for (i = N - 2; i >= 0; i--) { + if (arr[i] > arr[i + 1] && C[i] < C[i + 1] + 1) { + C[i] = C[i + 1] + 1 + } +} + +ans = sum of all values in C[] +``` +#### Complexity + +- **Time Complexity:** O(N) +- **Space Complexity:** O(N) + + +--- +### Problem 3 Maximum jobs + + +Given N jobs with their start and end times. Find the maximum number of jobs that can be completed if only one job can be done at a time. + +**Example** + + + +**Answer:** 5 + +We will select the jobs that are not overlapping: +- We select job `9 am - 11 am`, then we can not select `10 am - 1 pm` and `10 am - 2 pm` +- Then we select jobs `3 pm - 4 pm` and `4 pm - 6 pm` +- Then we select job `4 pm - 8 pm` and `8 pm - 10 pm` but we do not select job `7 pm - 9 pm` + + + + + + +#### Approach +We have to select the job in such a way that the start time of a currently selected job is greater than or equal to the end time of the previous job. + +`S[i] >= E[i - 1]` + + +--- +### Question + +What is the maximum number of jobs one person can do if only one job at a time is allowed, the start times and end times of jobs are: + +S = [1, 5, 8, 7, 12, 13] +E = [2, 10, 10, 11, 20, 19] + +**Choices** + +- [ ] 2 +- [x] 3 +- [ ] 4 +- [ ] 5 + + +**Explanation** + +S = [1, 5, 8, 7, 12, 13] +E = [2, 10, 10, 11, 20, 19] + + + +We will pick jobs `1 - 2`, `5 - 10` and `12 - 20`. So we can pick total three jobs. + + + + +--- + + +### Maximum jobs - Solution + +The first idea towards a solution is to first pick a job with minimum duration. + +#### Idea 1 - Greedy based on duration +Pick the job in the ascending order of the minimum duration. Let us take an example: + + + +In this case, if we select the minimum duration job first, then we will select the job `10 - 13`, then we can not select any other job because both overlap with it. + +But if we have not selected `10 - 13`, then we can select both other jobs, which means we can select two jobs. + + + + +So selecting a job in the ascending order of the duration will not always give us the maximum number of jobs. + + +#### Idea 2 - Greedy based on start time +Pick the job in the ascending order of the start time. Let us take an example: + + + + + + +In this case, if we select the minimum start time job first, then we will select the job `2 - 20`, then we can not select any other job because both overlap with it. + +But if we have not selected `2 - 20`, then we can select both other jobs, which means we can select two jobs. + + + +So selecting a job in the ascending order of the start time will not always give us the maximum number of jobs. + +#### Observation +We have to take a combination of the above approaches means we have to start early with the minimum duration job. + +start early + minimum duration + +A combination of both is nothing but simply means ending early. + +start early + minimum duration = end early + +#### Solution +We have to be greedy based on the end time, so we have to select jobs in the ascending order of end times. + +**Example:** + +S = [1, 5, 8, 7, 12, 13] +E = [2, 10, 10, 11, 20, 19] + +Sort these jobs based on the end time. + + +S = [1, 5, 8, 7, 13, 12] +E = [2, 10, 10, 11, 19, 20] + +Initially ans = 0. + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | +|:----------:| --- | --- | --- |:---:|:---:|:---:| +| Start time | 1 | 5 | 8 | 7 | 13 | 12 | +| end time | 2 | 10 | 10 | 11 | 19 | 20 | + + +- We will start with the first job, which has an end time 2 but now the start time of any next job must be greater than the end time of this job. + + +**So we need to keep track of the last end time.** + +Till now lastEndTime = 2 +ans+=1, ans = 1 + +- Now the job at index 1 has start time = 5, lastEndTime <= start time, so can select this job and lastEndTime will be updated to the end time of the current job and the answer is incremented by 1. +lastEndTime = 10 +ans+=1, ans = 2 +- Now the job at index 2 has start time = 8, lastEndTime > start time, so we can not select this job. +- Now the job at index 3 has start time = 7, lastEndTime > start time, so we can not select this job. +- Now the job at index 4 has start time = 13, lastEndTime <= start time, so can select this job and lastEndTime will be updated to the end time of the current job and the answer is incremented by 1. +lastEndTime = 19 +ans+=1, ans = 3 +- Now the job at index 5 has start time = 20, lastEndTime > start time, so we can not select this job. + +**Answer:** 3 + +#### PseudoCode +```cpp +1. Sort on the basis of end-time +2. ans = 1, lastEndTime = E[0] + for( i = 1 ; i < N ; i++){ + if(S[i] >= lastEndTime){ + ans++; + lastEndTime = E[i]; + } + } +3. return ans; +``` + +#### Complexity + +- **Time Complexity:** O(NlogN) +- **Space Complexity:** O(N) diff --git a/Academy DSA Typed Notes/Advanced/DSA Hashing 1 Introduction.md b/Academy DSA Typed Notes/Advanced/DSA Hashing 1 Introduction.md new file mode 100644 index 0000000..1d169d8 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Hashing 1 Introduction.md @@ -0,0 +1,561 @@ +# Hashing 1: Introduction + +--- + +## HashMap + +Let's take an example:- + +* Imagine we have a hotel called Reddison, which has 5 rooms. +* How can we maintain information on the status of rooms provided the hotel is old and hasn't adapted to technology yet? + +Solution: The hotel may maintain a manual register for five rooms like:- + +| Room no | occupied | +|:-------:|:--------:| +| 1 | Yes | +| 2 | No | +| 3 | Yes | +| 4 | No | +| 5 | No | + + +* After a few years, the hotel became a success, and the rooms increased to 1000. +* Provided the hotel decided to adapt to technology, what is the programmatically most straightforward approach to maintain the status of rooms? + * An array can be maintained where the index can denote the room number. + * If there are N rooms, we'll create an array of size + 1 where true denotes that room is occupied, and false denotes unoccupied. + +* Pandemic hit, due to which footfall reduced significantly. Owner visits Numerologist who asks them to change room numbers to some random lucky numbers from [1-109]. How can we maintain the status of the rooms now? + * Maintain boolean array of length 109 + 1 `bool arr[10^9 + 1]`. + * **ISSUE:** Status can be checked in O(1), but just for 1000 rooms, we require an array of size 109. + +* **Solution:** HashMaps + * HashMap is a data structure that stores pair. + + | Key | value | + |:------:|:--------:| + | 100003 | occupied | + | 3 | occupied | + | 10007 | occupied | + + + +* **In HashMap, T.C of search is O(1) time and S.C is O(N)** +* Key must be unique +* Value can be anything +* **Note:** We'll discuss the internal working of Map in Advanced classes. + +**In hashmap approach we can search in O(1) time and can have a space complexity of O(N)** + +Let's see some questions based on Hashmap. + +--- +### Question + +Which of the following HashMap will you use to store the population of every country? + +**Choices** + +- [ ] HashMap +- [ ] HashMap +- [ ] HashMap +- [x] HashMap + + + +* Key must be unique in Hashmap, so for that reason : + * We use the country name as the key. + * Since the country name is a `string`, the key would be of type `string`. +* In this case, value is a population that can be stored in `int` or `long` datatype. +* Solution:- +`hashmap populationByCountry`. + +--- +### Question + +Which of the following HashMap will you use to store the no of states of every country? + +**Choices** + +- [ ] HashMap +- [ ] HashMap +- [x] HashMap +- [ ] HashMap + + + +* Key must be unique in Hashmap, so for that reason : + * We use the country name as the key. + * Since the country name is a `string`, the key would be of type `string`. +* We know that value can be anything. In this case : + * Value is the number of states stored in `int` or `long` datatype. +* Solution:- +`hashmap numberOfStatesByCountry` + +--- +### Question + +Which of the following HashMap will you use to store the name of all states of every country? + +**Choices** + +- [ ] HashMap > +- [x] HashMap > +- [ ] HashMap +- [ ] HashMap + + + +* Key must be unique in Hashmap, so for that reason : + * We use the country name as the key. + * Since the country name is a `string`, the key would be of type `string`. +* Value can be anything. In this case: + * Value is the name of states. + * To store them, we would require a list of strings, i.e., `vector` in C++ or `ArrayList` in Java, etc., to store the name of states. + + +* Solution:- +`hashmap> nameOfStatesByCountry` + + + +--- +### Question + +Which of the following HashMap will you use to store the population of each state in every country? + +**Choices** + +- [ ] HashMap +- [ ] HashMap > +- [x] HashMap > +- [ ] HashMap + + + +* Key must be unique in Hashmap, so for that reason : + * We use the country name as the key. + * Since the country name is a `string`, the key would be of type `string`. +* Value can be anything. In this case : + * We need to store the name of states with its population. + * We will create another hashmap with the state name as key and population as value. +* Solution:- +`hashmap> populationOfStatesByCountry` + +We can observe that:- +* **Value can be anything.** +* **Key can only be a primitive datatype.** + + +--- +## HashSet + + +Sometimes we only want to store keys and do not want to associate any values with them, in such a case; we use HashSet. + +`Hashset` + + +* **Key must be unique** +* **Like HashMap, we can search in O(1) time in Set** + +--- +### HashMap and HashSet Functionalities +### HashMap +* **INSERT(Key,Value):** new key-value pair is inserted. If the key already exists, it does no change. +* **SIZE:** returns the number of keys. +* **DELETE(Key):** delete the key-value pair for given key. +* **UPDATE(Key,Value):** previous value associated with the key is **overridden** by the new value. +* **SEARCH(Key):** searches for the specified key. + +### HashSet + +* **INSERT(Key):** inserts a new key. If key already exists, it does no change. +* **SIZE:** returns number of keys. +* **DELETE(Key):** deletes the given key. +* **SEARCH(Key):** searches for the specified key. + +**Time Complexity** of **all the operations** in both Hashmap and Hashset is **O(1)**. + +Therefore, if we insert N key-value pairs in HashMap, then time complexity would be O(N) and space complexity would be O(N). + +### Hashing Library Names in Different Languages + + + +| | Java | C++ | Python | Js | C# | +|:-------:|:-------:|:-------------:|:----------:|:---:|:----------:| +| Hashmap | Hashmap | unordered_map | dictionary | map | dictionary | +| Hashset | Hashset | unordered_set | set | set | Hashset | + +--- +### Problem 1 Frequency of given elements + +**Problem Statement** + Given N elements and Q queries, find the frequency of the elements provided in a query. + +**Example** + +N = 10 + +| 2 | 6 | 3 | 8 | 2 | 8 | 2 | 3 | 8 | 10 | 6 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| + +Q = 4 + +| 2 | 8 | 3 | 5 | +|:---:|:---:|:---:|:---:| + + +#### Solution + + +| Element | Frequency | +|:-------:|:---------:| +| 2 | 3 | +| 8 | 3 | +| 3 | 2 | +| 5 | 0 | + +#### Idea 1 + +* For each query, find the frequency of the element in the Array. +* TC - **O(Q*N)** and SC - **O(1)**. +>How can we improve TC? + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach + +* First, search for the element in the Hashmap. + * If the element does not exist, then insert the element as key and value as 1. + * If an element already exists, then increase its value by one. + +#### Pseudeocode +```cpp +Function frequencyQuery(Q[], A[]) +{ + Hashmap mp; + q = Q.length + n = A.length + + for(i = 0 ; i < n ; i ++ ) + { + if(mp.Search(A[i]) == true) + { + mp[Array[i]] ++ + } + else{ + mp.Insert(A[i],1) + } + } + + for(i = 0 ; i < q; i ++ ) + { + if(mp.Search(Q[i]) == true) + { + print(mp[Q[i]]) + } + else{ + print("0") + } + } +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + + +--- +### Problem 2 First non repeating element + +**Problem Statement** + +Given N elements, find the first non-repeating element. + +**Example** + +Input 1: +``` +N = 6 +``` +| 1 | 2 | 3 | 1 | 2 | 5 | +|:---:|:---:|:---:|:---:|:---:|:---:| + +Output1 : +```plaintext +ans = 3 +``` + +| 1 | 2 | 3 | 1 | 2 | 5 | +|:---:|:---:|:---:|:---:|:---:|:---:| + +Input 2: +``` +N = 8 +``` + +| 4 | 3 | 3 | 2 | 5 | 6 | 4 | 5 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| + +Output 2: +```plaintext +ans = 2 +``` +Input 3: +``` +N = 7 +``` + +| 2 | 6 | 8 | 4 | 7 | 2 | 9 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:| + +Output 3: +```plaintext +ans = 6 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Solution +**Idea 1** + +* Use Hashmap to store the frequency of each element. Store <**key**:element, **value**:frequency>. +* Iterate over the Hashmap and find the element with frequency 1. + +**Flaw in Idea 1** + +* When we store in Hashmap, the order of elements is lost; therefore, we cannot decide if the element with frequency 1 is first non-repeating in the order described in the Array. + +**Idea 2** + +* Use Hashmap to store the frequency of each element. Store ``. +* Instead of Hashmap, iterate over the Array from the start. If some element has a frequency equal to one, then return that element as answer. + + +#### Pseudeocode +```cpp +Function firstNonRepeating(A[]) { + Hashmap < int, int > mp; + n = A.length + + for (i = 0; i < n; i++) { + if (mp.Search(A[i]) == true) { + mp[A[i]]++ + } else { + mp.Insert(A[i], 1) + } + } + for (i = 0; i < n; i++) { + if (mp[A[i]] == 1) { + return A[i] + } + } + return -1 +} +``` + +Time Complexity : **O(N)** +Space Complexity : **O(N)** + +--- +### Problem 3 Count of Distinct Elements + +**Problem Statement** + +Given an array of N elements, find the count of distinct elements. + +**Example** +**Input:** + +N = 5 + +| 3 | 5 | 6 | 5 | 4 | +|:---:|:---:|:---:|:---:|:---:| + +**Output:** + +```plaintext +ans = 4 +``` +**Explanation:** We have to return different elements present. If some element repeats, we will count it only once. + + +**Input:** +N = 3 + + +| 3 | 3 | 3 | +|:---:|:---:|:---:| + +**Output:** +```plaintext +ans = 1 +``` +**Input:** + +N = 5 + +| 1 | 1 | 1 | 2 | 2 | +|:---:|:---:|:---:|:---:|:---:| + + +**Output:** +```plaintext +ans = 2 +``` +**Solution** + +* Insert element in Hashset and return the size of HashSet. + +> In Hashset, if a single key is inserted multiple times, still, its occurrence remains one. + + +#### Pseudeocode +```cpp +Function distinctCount(Array[]) { + hashset < int > set; + for (i = 0; i < Array.length; i++) { + set.insert(Array[i]) + } + return set.size +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + + + +--- +### Problem 4 Subarray sum 0 + +**Problem Statement** + +Given an array of N elements, check if there exists a subarray with a sum equal to 0. + +Example +**Input:** + +N = 10 + + +| 2 | 2 | 1 | -3 | 4 | 3 | 1 | -2 | -3 | 2 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| + +**Output:** +if we add elements from index 1 to 3, we get 0; therefore, the answer is **true**. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Solution +* Traverse for each subarray check if sum == 0. + * Brute Force: Create all Subarrays, Time complexity: **O(n3)**. + * We can optimize further by using **Prefix Sum** or **Carry Forward** method and can do it in Time Complexity: **O(n2)**. + * How can we further optimize it? + +#### Observations + +* Since we have to find sum of a subarrays(range), we shall think towards **Prefix Sum**. + +Initial Array: - + + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| 2 | 2 | 1 | -3 | 4 | 3 | 1 | -2 | -3 | 2 | + +Prefix sum array: - + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| 2 | 4 | 5 | 2 | 6 | 9 | 10 | 8 | 5 | 7 | + +We need a subarray with **sum(i to j) = 0** +Using Prefix Sum Array, +**PrefixSum[j] - PrefixSum[i-1] = 0 +PrefixSum[j] = PrefixSum[i-1]** + +It implies, if there exist duplicate values in Prefix Sum Array, then the sum of a subarray is 0. + +Example, + +```cpp +PrefixSum[2] = 5 +PrefixSum[8] = 5 +sum of elements in intial array from index 3 to 8 = 0 +``` + +**Summary** +* If numbers are repeating in Prefix Sum Array, then there exists a subarray with sum 0. +* Also, if the Prefix Sum Array element is 0, then there exists a subarray with sum 0. + * Example: + * A[] = {2, -1, 3, 5} + * PrefixSum[] = {2, -1, 0, 5} + * Here, 0 in PrefixSum Array implies that there exist a subarray with sum 0 starting at index 0. + + +#### Approach + +* Calculate prefix sum array. +* Traverse over elements of prefix sum array. + * If the element is equal to 0, return true. + * Else, insert it to HashSet. +* If the size of the prefix array is not equal to the size of the hash set, return true. +* Else return false. + +#### Pseudeocode +```cpp +// 1. todo calculate prefix sum array + +// 2. +Function checkSubArraySumZero(PrefixSumArray[]) { + Hashset < int > s + for (i = 0; i < PrefixSumArray.length; i++) { + if (PrefixSumArray[i] == 0) { + return true + } + s.insert(PrefixSumArray[i]) + } + if (s.size != PrefixSumArray.size) + return true + return false +} +``` +Time Complexity : **O(N)** +Space Complexity : **O(N)** + + +--- +### HINT for Count Subarrays having sum 0 +Given an array A of N integers. + +Find the count of the subarrays in the array which sums to zero. Since the answer can be very large, return the remainder on dividing the result with 109+7 + +**Input 1** +A = [1, -1, -2, 2] + +**Output 1** +3 + +Explanation +The subarrays with zero sum are [1, -1], [-2, 2] and [1, -1, -2, 2]. + +**Input 2** +A = [-1, 2, -1] + +**Output 2** +1 + +Explanation +The subarray with zero sum is [-1, 2, -1]. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Hashing 2 Problems.md b/Academy DSA Typed Notes/Advanced/DSA Hashing 2 Problems.md new file mode 100644 index 0000000..83a64c2 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Hashing 2 Problems.md @@ -0,0 +1,490 @@ +# Hashing Problems + +--- +## Problem 1 Pair Sum K +Given arr[N] and K, check if there exists a pair(i, j) such that, +```kotlin +arr[i] + arr[j] == K && i != j +``` + +**Example** +Let's say we have an array of 9 elements and K, where K is our target sum, + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:-----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| Array | 8 | 9 | 1 | -2 | 4 | 5 | 11 | -6 | 4 | + +K = 6: arr[2] + arr[5] : such a pair exists +K = 22: does not exist +K = 8: arr[4] + arr[8]: such a pair exists + +Hence if K = `6` or `8` the answer is `true`, for K = `22`, it will be `false`. + +--- +### Question +Check if there exists a pair(i, j) such that, arr[i] + arr[j] == K && i != j in the given array A = [3, 5, 1, 2, 1, 2] and K = 7. + + +**Choices** +- [x] true +- [ ] false + +### Question +Check if there exists a pair(i, j) such that, arr[i] + arr[j] == K && i != j in the given array A = [3, 5, 1, 2, 1, 2] and K = 10. + + +**Choices** +- [ ] true +- [x] false + +--- + +:::warning +Please take some time to think about the bruteforce approach on your own before reading further..... +::: + +### Problem 1 Brute Force +#### Idea 1: +Iterate on all pairs(i, j) check if their sum == k + +**Example 2**: +Take another example of arr[5] +| Index | 0 | 1 | 2 | 3 | 4 | +|:------:|:---:|:---:|:---:|:---:|:---:| +| arr[5] | 3 | 2 | 6 | 8 | 4 | + +We can have following cases of pairs from an array of size 5 + + + +“” + +* Here, since we are not allowed to consider pairs where i == j these diagonal elements (marked in red) will not be considered. +* Now, as you can see the upper (blue) and lower (yellow) triangles represent the same pairs (order of pair doesn't matter here) our program would work with either one of these triangular parts. + +*Now, considering upper triangle -* +#### Observation: + +| i | j loops from [i...(N - 1)] | +|:---:|:------------------------:| +| 0 | [0..N-1] | +| 1 | [1..N-1] | +| 2 | [2..N-1] | +| 3 | [3..N-1] | +| 4 | - | + +Here for every index of i, j loops from i to N - 1 + +For an `arr[i]`, the target will be `K-arr[i]` + +#### Pseudocode: +```kotlin +boolean checkPair(int arr[], int K) { + + int N = arr.length + for (int i = 0; i < N; i++) { + //target: K-arr[i] + for (int j = i; j < N; j++) { + if (arr[i] == K - arr[i]) { + return true; + } + } + } + return false; +} + +``` + +#### Complexity +**Time Complexity:** O(N^2) +**Space Complexity:** O(1) + + +--- +### Problem 1 Optimization with HashSet(Doesn't Work) + +* We can insert all elements in the set initially. +* Now, iterate over every arr[i] and check if K-arr[i] is present in the set. If yes, return tue, else false. + + +“” + + +--- +**ISSUE: (Edge Case)** + +* For even K value, say arr[i] is K/2 and only one occurrence of it is present. +* Eg: A[] = {8, 9, 2, -1, 4, 5, 11, -6, 4}; K=4, we will end up considering 2(present at index 2) two times. + +“” + + +We can see the above logic isn't working + +### Resolution: +We need not insert all elements into set at once. Rather only insert from [0, i - 1]. + + +--- +### Problem 1 Optimization with HashSet(Works) + +At ith index: Hashset should contain all the elements:[0...i - 1] + +Let's take an example, + +“” + + + +* Initially set is empty. +* For every element at ith index, search for target (arr[i] - K) in set. +* If found, it means it must have been previously inserted. If not, we'll insert arr[i], because in future if we'll find a pair, we'll be able to get the current element. + +Let's take another example, + + +“” + + + +#### Pseudocode: +```kotlin +boolean targetSum(int arr[], int K) { + int N = arr.length; + Hashset < int > bs; + + for (int i = 0; i < N; i++) { + //target = K - arr[i] + if (bs.contains(K - arr[i])) { + return true; + } else { + bs.add(arr[i]); + } + } + return false; +} +``` +--- +### Question +Count pairs(i, j) such that, arr[i] + arr[j] == K && i != j in the given array. +A = [3, 5, 1, 2, 1, 2] and K = 3. + + +**Choices** +- [ ] 1 +- [ ] 2 +- [ ] 3 +- [x] 4 + + + +In the given array A = [3, 5, 1, 2, 1, 2], pairs with sum = 3 are: + +| Pairs | +| ------ | +| {2, 3} | +| {2, 5} | +| {3, 4} | + +--- +### Problem 2 Count no. of pairs with sum K + +Given an `arr[n]`, count number of pairs such that +```kotlin +arr[i] + arr[j] = K && i != j +``` + +**Example** + +Provided we have an arr[8] and K = 10, we have +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| arr[8] | 2 | 5 | 2 | 5 | 8 | 5 | 2 | 8 | + +**Pairs:** + +| Pairs: 9 | +|:--------:| +| {0, 4} | +| {0, 7} | +| {1, 5} | +| {1, 3} | +| {2, 4} | +| {2, 7} | +| {3, 5} | +| {4, 6} | +| {6, 7} | + +Here (i, j) and (j, i) considered as same. + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +### Optimised Approach(Same as in previous question) +* Similar to our previous problem, we'll be searching for our target. +* This time we also need to consider the frequency of how many times a particular element appeared, so we shall be maintianing a map. + + + +“” + + + +### Pseudocode: +```kotlin +int countTargetSum(int arr[], int K) { + int N = arr.length; + Hashmap < int, int > hm; + + int c = 0; + + for (int i = 0; i < n; i++) { + //target = K-arr[i] + if (hm.contains(K - arr[i])) { + c = c + hm[K - arr[i]] //freq of target = pairs + } + + //insert arr[i] + if (hm.contains(arr[i])) { + hm[arr[i]]++; + } else { + hm.put(arr[i], 1); + } + } + return c; +} + +``` + +### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +--- +### Problem 3 Subarray with Sum K +Given an array arr[n] check if there exists a subarray with sum = K + +### Example: +We have the following array + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| arr[7] | 2 | 3 | 9 | -4 | 1 | 5 | 6 | 2 | 5 | + +Possible subarrays for the following values of K are, +* k = 11: {2 3 9 -4 1}, {5, 6} +* k = 10: {2 3 9 -4} +* k = 15: {-4, 1, 5, 6, 2, 5} + +--- +### Question +Check if there exist a subarray with sum = 110 in the given array? +A = [ 5, 10, 20, 100, 105 ] + + +**Choices** +- [x] No +- [ ] YES + + +--- +### Approach + +To get subarray sum for any subarray in constant time, we can create a prefix sum array. + +Now, a subarray sum `PF[i] - PF[j]` should be equal to `K` + +OR +**a - b = K** + +We can fix `a` and get the corresponding pair for it, given by `a - K` + +> We can create a HashSet at the time of traversal simultaneously +> Here, instead of creating prefix sum initially, we are calculating it while iterating through the array. + +“” + + + +**Edge case:** +If subarray from index 0 has sum = K. +Say, K = 10 +a = 10, b = 10-10=0, now 0 won't be present in the array. +Please take below example: + +“” + + +**To resolve this, take 0 in the set initially.** + +“” + + +#### Pseudocode: +```kotlin +boolean targetSubarray(int arr[], int K) { + int N = arr.length; + long a = 0; + + //cumulative sum, long -> to avoid overflow + HashSet < long > hs; + hs.add(0); + for (int i = 0; i < N; i++) { + a = a + arr[i]; + + //cumulative sum = target = a - k + if (hs.contains(a - K)) { + //subarray exists + return true; + } else { + hs.add(a); + + } + + } + return false; +} + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + + +--- +### Problem 4 Distinct elements in every window of size K + +Given an array of integers and a number, K. Find the count of distinct elements in every window of size K in the array. + +**Example** + +```java +// Input: +Array = [1, 2, 1, 3, 4, 2, 3] +K = 4 + +// Output: +[3, 4, 4, 3] +``` + +- In the first window `[1, 2, 1, 3]`, there are 3 distinct elements: 1, 2, and 3. +- In the second window `[2, 1, 3, 4]`, there are 4 distinct elements: 2, 1, 3, and 4. +- In the third window `[1, 3, 4, 2]`, there are again 4 distinct elements: 1, 3, 4, and 2. +- In the fourth window `[3, 4, 2, 3]`, there are 3 distinct elements: 3, 4, and 2. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Approach - Using HashSet + +- The code iterates through each possible window of size K in the given array. +- For each window, a temporary HashSet (`distinctSet`) is created to store the distinct elements within that window. +- Within the inner loop, the code adds each element of the window to the HashSet. +- After processing the entire window, the size of the HashSet is calculated using `distinctSet.size()`, which represents the count of distinct elements. +- The count is then added to the result list. +- This process is repeated for all possible windows in the array. +- The result list contains the count of distinct elements in each window + +#### Pseudocode + +```java +//Pseudo code for 'countDistinctElements' function +function countDistinctElements(arr, k): + result = empty list + + for i = 0 to length of arr - k: + distinctSet = empty set + + for j = i to i + k - 1: + add arr[j] to distinctSet + + add size of distinctSet to result + + return result +``` + +#### Complexity +**Time Complexity:** `O((N-K+1) * K)` + +Considering the values of `K` as N/2, 1, and N. +**When K = N/2:** + If `K` is about half of `N`, then the expression simplifies to `O((N/2 + 1) * N/2)`, which further simplifies to `O((N^2 + N) / 4)`. In this case, the primary factor is `N^2`, leading to a time complexity of approximately `O(N^2)`. +**When K = 1:** + When `K` is set to 1, the expression becomes `O((N - 1 + 1) * 1)`, which straightforwardly simplifies to `O(N)`. It's important to note that this doesn't align with the original statement of the time complexity being `O(N^2)`. +**When K = N:** + If `K` is equal to `N`, then the expression becomes `O((N - N + 1) * N)`, which further simplifies to `O(N^2)`. + +**Space Complexity:** O(K) + +--- +### Problem 4 Sliding Window - Map + +Sliding Window suggests to insert all elements of the first window in the set. Now slide the window, throw the prev element out and insert new adjacent element in the set. + +But we can't use Set here, since it is possible that the element just thrown out may be present in the current window. + +We will also need to maintain the frequency of elements, hence we will use Hashmap. + +- Maintain a HashMap to track the frequency of elements within the current subarray. +- Initially, the algorithm populates the HashMap with the elements of the first subarray, counting distinct elements. +- Then, as the window slides one step at a time: + - The algorithm updates the HashMap by updating frequency of the element leaving the window and increasing frequency of the new element entering the window. +- The distinct element count for each subarray is determined by the size of the HashMap. + +#### Pseudocode + +```java +void subfreq(int ar[], int k) { + int N = ar.length; + + HashMap < int, int > hm; + + // Step 1: Insert 1st subarray [0, k-1] + for (int i = 0; i < k; i++) { + //Increase frequecy by 1 + if (hm.contains(ar[i])) { + int val = hm.get(ar[i]); + hm.put(ar[i], val + 1); + } else { + hm.put(ar[i], 1); + } + + print(hm.size()); + } + + //step 2: Iterate all other subarrays + int s = 1, e = k; + + while (e < N) { + //Remove ar[s-1] + int val = hm[ar[s - 1]]; + hm[ar[s - 1]]--; + + if (hm.get[ar[s - 1]] == 0) { + hm.remove(ar[s - 1]); + } + + //add ar[e] + if (hm.contains(ar[e])) { + //Inc freq by 1 + int val = hm[ar[e]]; + hm[ar[e]]++; + } else { + hm.put(ar[e], 1); + } + + print(hm.size()); + s++ + + } +} + +``` +#### Complexity +**Time Complexity**: `O(n)` +**Space Complexity**: `O(n)` + diff --git a/Academy DSA Typed Notes/Advanced/DSA Hashing 3 Internal Implementation & Problems.md b/Academy DSA Typed Notes/Advanced/DSA Hashing 3 Internal Implementation & Problems.md new file mode 100644 index 0000000..4d84e85 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Hashing 3 Internal Implementation & Problems.md @@ -0,0 +1,459 @@ +# Hashmap Implementation + +--- +## Check if given element exists in Q queries + + +Given an array of size N and Q queries. In each query, an element is given. We have to check whether that element exists or not in the given array. + +**Example** + +A [ ] = {`2, 4, 11, 15 , 6, 8, 14, 9`} + +`4 Queries` +`K = 4` (return true) +`K = 10` (return false) +`K = 17` (return false) +`K = 14` (return true) + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Brute Force Approach + +For every query, loop through the given array to check the presence. + +Time Complexity - **O(N * Q)** +Space Complexity - **O(1)** + +#### Observation + +We can create an array to mark the presence of an element against that particular index. + +A [ ] = {`2, 4, 11, 15 , 6, 8, 14, 9`} + +For example we can mark presence of +2 at index 2 +4 at index 4 and so on.... + +To execute that, we'll need to have indices till 15(max of Array). +The array size needed is 16. + +Let's call that array as - DAT (Direct Access Table) +int dat[16] = {0}; //initally assuming an element is not present + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | +| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + + +Let's mark the presence. +```cpp +for(int i = 0; i < N; i++) { + dat[A[i]] = 1; +} +``` + +Below is how that array looks like - + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | +| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | + +#### Advantage of using DAT + +1. Time Complexity of Insertion - `O(1)` +2. Time Complexity of Deletion - `O(1)` +3. Time Complexity of Search - `O(1)` + +#### Issues with such a representation + +**1. Wastage of Space** +* Say array is `A[] = {23, 60, 37, 90}`; now just to store presence of 4 elements, we'll have to construct an array of `size 91`. + +**2. Inability to create big Arrays** +* If values in array are as big as $10^{15}$, then we will not be able to create this big array. At max array size possible is 10^6^(around) + +**3. Storing values other than positive Integers** +* We'll have to make some adjustments to store negative numbers or characters. (It'll be possible but needs some work-around) + +--- +### Overcome Issues while retaining Advantages + + +Let's say we have restriction of creating only array of size 10. + +Given Array - +A [ ] = {`21, 42, 37, 45 , 99, 30`} + +**How can we do so ?** + +In array of size 10, we'll have indices from 0 to 9. How can we map all the values within this range ? + +**Basically, we can take a mod with 10.** + +21 % 10 = 1 (presence of 21 can be marked at index 1) + +42 % 10 = 2 (presence of 42 can be marked at index 2) + +37 % 10 = 7 (presence of 37 can be marked at index 7) + +45 % 10 = 5 (presence of 45 can be marked at index 5) + +99 % 10 = 9 (presence of 99 can be marked at index 9) + +30 % 10 = 0 (presence of 30 can be marked at index 0) + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +| 30 | 21 | 42 | 0 | 0 | 45 | 0 | 37 | 0 | 99 | + + +#### What Have We Done ? + +* We have basically done Hashing. Hashing is a process where we pass our data through the Hash Funtion which gives us the hash value(index) to map our data to. +* In this case, the hash function used is **MOD**. This is the simplest hash function. Usually, more complex hash functions are used. +* The DAT that we created is known as **Hash Table** in terms of Hashing. + + + +#### Issue with Hashing ? + +**COLLISION!** + +Say given array is as follows - + +A [ ] = {21, 42, 37, 45, 77, 99, 31} + +Here, 21 & 31 will map to the same index => 1 +37 & 77 map to same index => 7 + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/054/854/original/Screenshot_2023-10-24_at_2.53.50_PM.png?1698139444) +**Can we completely avoid collision ?** + +`Not Really!` + +No matter how good a hash function is, we can't avoid collision! + +**Why ?** + +We are trying to map big values to a smaller range, collisions are bound to happen. + +Moreover, this can be explained using `Pigeon Hole Principle!` + +**Example -** + +Say we have 11 pigeons and we have only 8 holes to keep them. Now, provided holes are less, atleast 2 pigeons need to fit in a single hole. + +But, we can find some resolutions to collision. + +--- +### Collision Resolution Techniques + + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/054/865/original/Screenshot_2023-10-24_at_7.11.17_PM.png?1698154890) + + +>From Interview Perspective, Open Hashing is Important hence, we'll dive into that. + + + +--- +### Chaining + + +Let's take the above problem where collision happened! + +A [ ] = {`21, 42, 37, 45, 77, 99, 31`} + +Here, 21 & 31 will map to the same index => 1 +37 & 77 map to same index => 7 + +**How can we resolve Collision here?** + +We can somehow store both 21 & 31 at the same index. + +Basically we can have a linked list at every index. +i.e, Array of Linked List + + +Every index shall have head node of Linked List. + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/054/867/original/IMG_A28158A44160-1.jpeg?1698155988) + +**The above method is known as Chaining.** + +* **Chaining** is a technique used in data structures, particularly hash tables, to resolve collisions. When multiple items hash to the same index, chaining stores them in a linked list or another data structure at that index. + +**What will be the Time Complexity of Insertion ?** + +* First we will pass the given element to Hash Function, which will return an index. Now, we will simply add that element to the Linked List at that index. +* If we insert at **tail** => `O(N)` +* If we insert at **head** => `O(1)` +Since order of Insertion doesn't matter to us, so we can **simply insert at head**. + +**What will be the Time Complexity of Deletion and Searching ?** + + +* Time Complexity on average is always less than $\lambda$. $\lambda$ is known as lamda. + +* Time Complexity in worst case is still O(N) + +--- +### What is lamda + + +There is a lamba($\lambda$) function which is nothing but a ratio of (number of elements inserted / size of the array). + +**Example:** + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/054/901/original/Screenshot_2023-10-25_at_2.53.39_PM.png?1698225828) + +Table size(Array size) = 8 +Inserted Elements = 6 + +$\lambda$ = $\frac{6}{8}$ = 0.75 + +Let's assume the predefined threshold is 0.7. The load factor is exceeding this value, so we will need to rehash the table. + +**Rehashing:** + +* Create a new hash table with double the size of the original hash table. In this case, the new size will be +* 8×2=16 +* Redistribute the existing elements to their new positions in the larger hash table using a new hash function. +* The load factor is now recalculated for the new hash table: +* +$\lambda$ = $\frac{6}{16} = 0.375$ (within the threshold of 0.7) + +--- +### Code Implementation + +#### Declaring the HashMap Class + +Let's go through the code implementation of a hashmap: + +* The HashMap class is defined with generic types `K` and `V` for keys and values. +* The inner class `HMNode` represents a node containing a key-value pair. +* `buckets` is an array of ArrayLists to store key-value pairs. +* `size` keeps track of the number of key-value pairs in the hashmap. +* The `initbuckets()` method initializes the array of buckets with a default size of 4. + +```java +import java.util.ArrayList; + +class HashMap < K, V > { + + private class HMNode { + K key; + V value; + + public HMNode(K key, V value) { + this.key = key; + this.value = value; + } + } + + private ArrayList < HMNode > [] buckets; + private int size; // number of key-value pairs + + public HashMap() { + initbuckets(); + size = 0; + } + + private void initbuckets() { + buckets = new ArrayList[4]; + for (int i = 0; i < 4; i++) { + buckets[i] = new ArrayList < > (); + } + } +``` + +#### Put Method +* The `put` method adds a key-value pair to the hashmap. +* It calculates the bucket index (`bi`) using the `hash` method and finds the data index within the bucket using `getIndexWithinBucket`. +* If the key is found in the bucket, it updates the value. Otherwise, it inserts a new node. +* After inserting, it checks the load factor (`lambda`) and triggers rehashing if the load factor exceeds 2.0. + +```java + public void put(K key, V value) { + int bi = hash(key); + int di = getIndexWithinBucket(key, bi); + + if (di != -1) { + // Key found, update the value + buckets[bi].get(di).value = value; + } else { + // Key not found, insert new key-value pair + HMNode newNode = new HMNode(key, value); + buckets[bi].add(newNode); + size++; + + // Check for rehashing + double lambda = size * 1.0 / buckets.length; + if (lambda > 2.0) { + rehash(); + } + } + } +``` + +#### Hash Method +* The `hash` method calculates the bucket index using the hash code of the key and takes the modulus to ensure it stays within the array size. +```java + private int hash(K key) { + int hc = key.hashCode(); + int bi = Math.abs(hc) % buckets.length; + return bi; + } +``` + +#### Get Index within Bucket +* The `getIndexWithinBucket` method searches for the data index (`di`) of a key within a specific bucket. It returns -1 if the key is not found +```java + private int getIndexWithinBucket(K key, int bi) { + int di = 0; + for (HMNode node: buckets[bi]) { + if (node.key.equals(key)) { + return di; // Key found + } + di++; + } + return -1; // Key not found + } +``` + +#### Rehash Method + +* The `rehash` method is called when the load factor exceeds 2.0. +* It creates a new array of buckets, initializes the size to 0, and iterates through the old buckets, reinserting each key-value pair into the new array. +* +```java + private void rehash() { + ArrayList < HMNode > [] oldBuckets = buckets; + initbuckets(); + size = 0; + + for (ArrayList < HMNode > bucket: oldBuckets) { + for (HMNode node: bucket) { + put(node.key, node.value); + } + } + } +``` + +#### Get Method + +* The `get` method retrieves the value associated with a given key. It calculates the bucket index and searches within the bucket to find the key. +```java + public V get(K key) { + int bi = hash(key); + int di = getIndexWithinBucket(key, bi); + + if (di != -1) { + return buckets[bi].get(di).value; + } else { + return null; + } + } +``` + +#### Contains Key Method + +* The `containsKey` method checks if a given key exists in the hashmap by calculating the bucket index and checking the data index within the bucket. + +```java + public boolean containsKey(K key) { + int bi = hash(key); + int di = getIndexWithinBucket(key, bi); + + return di != -1; + } +``` + +#### Remove Method + +* The `remove` method removes a key-value pair from the hashmap. If the key is found, it returns the value; otherwise, it returns null + +```java + public V remove(K key) { + int bi = hash(key); + int di = getIndexWithinBucket(key, bi); + + if (di != -1) { + // Key found, remove and return value + size--; + return buckets[bi].remove(di).value; + } else { + return null; // Key not found + } + } +``` + +#### Size Method +The `size` method returns the total number of key-value pairs in the hashmap. + +```java + public int size() { + return size; + } +``` + +#### Key Set Method + +* The `keyset` method returns an ArrayList containing all the keys in the hashmap by iterating through the buckets and nodes. + +```java + public ArrayList < K > keyset() { + ArrayList < K > keys = new ArrayList < > (); + for (ArrayList < HMNode > bucket: buckets) { + for (HMNode node: bucket) { + keys.add(node.key); + } + } + return keys; + } + } +``` + +--- +### Question +What is the time complexity of the brute-force approach for checking the existence of an element in the array for Q queries? + +**Choices** +- [ ] O(N) +- [ ] O(Q) +- [x] O(N * Q) +- [ ] O(1) + +--- +### Question +What advantage does the Direct Access Table (DAT) provide in terms of time complexity for insertion, deletion, and search operations? + +**Choices** +- [x] O(1) for all operations +- [ ] O(N) for all operations +- [ ] O(1) for insertion and deletion, O(N) for search +- [ ] O(N) for insertion and deletion, O(1) for search + +--- +### Question +What is the purpose of the load factor (lambda) in a hashmap? + +**Choices** +- [ ] It represents the number of elements in the hashmap. +- [ ] It is used to calculate the hash code of a key. +- [x] It determines when to trigger rehashing. +- [ ] It controls the size of the hashmap. + + +--- +### Question +What does the rehashing process involve in a hashmap? + +**Choices** +- [ ] Reducing the size of the hashmap +- [x] Creating a new hash table with double the size and redistributing elements +- [ ] Deleting all elements from the hashmap +- [ ] Removing collision resolution techniques diff --git a/Academy DSA Typed Notes/Advanced/DSA Heaps 1 Introduction.md b/Academy DSA Typed Notes/Advanced/DSA Heaps 1 Introduction.md new file mode 100644 index 0000000..ca30a99 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Heaps 1 Introduction.md @@ -0,0 +1,557 @@ +# Advanced DSA: Heaps 1: Introduction + +--- +## Problem 1 Connecting the ropes + +We are given an array that represents the size of different ropes. In a single operation, you can connect two ropes. Cost of connecting two ropes is sum of the length of ropes you are connecting. Find the minimum cost of connecting all the ropes. + +**`To illustrate:`** + +**Example 1**: + +int A[] = {2, 5, 3, 2, 6} + + + +**Example 2**: + +**`Initial Ropes: [2, 5, 6, 3]`** + +Connect 2 and 5 (Cost = 2 + 5 = 7) +Total Cost: 7 +New Ropes: [7, 6, 3] +Next Step: [7, 6, 3] + +Connect 7 and 6 (Cost = 7 + 6 = 13) +Total Cost: 7 + 13 = 20 +New Ropes: [13, 3] +Final Step: [13, 3] + +Connect 13 and 3 (Cost = 13 + 3 = 16) +Total Cost: 20 + 16 = 36 +Final Rope: [16] + +This is one of the options for finding the cost of connecting all ropes, but we need to find the minimum cost of connecting all the ropes. + + +#### Observation +Say, we have 3 ropes, **`x < y < z`** +Which 2 ropes should we connect first ? + +| Case | 1 | 2 |3| +| --------| -------- | -------- |--| +| Step 1 | x+y | x+z |y+z| +| Step 2 | (x+y) + z | (x+z) + y |(y+z) + x| + +Comparing case 1 and 2, y and z are different, now since y < z, we can say cost of 1 < cost of 2. + + +Comparing case 2 and 3, x and y are different, now since x < y, we can say cost of 2 < cost of 3. + +**`Conclusion:`** Connecting smaller length ropes gives us lesser cost. + +#### Process: + +**`Initial Setup:`** Start with an array of rope lengths, e.g., [2, 2, 3, 5, 6]. First, sort the array. + +**`Combining Ropes:`** + +- Continuously pick the two smallest ropes. +- Combine these ropes, adding their lengths to find the cost. +- Insert the combined rope back into the array at its correct position in sorted array. +- Repeat until only one rope remains. + +We are basically applying **`insertion sort`**. + +**`Example Steps:`** + +- Combine ropes 2 and 2 (cost = 4). New array: [3, 4, 5, 6]. Total cost: 4. +- Combine ropes 3 and 4 (cost = 7). New array: [5, 6, 7]. Total cost: 11. +- Combine ropes 5 and 6 (cost = 11). New array: [7, 11]. Total cost: 22. +- Combine ropes 7 and 11 (cost = 18). Final rope: 18. Total cost: 40. + + +#### Complexity +**Time Complexity:** O(N^2^) +**Space Complexity:** O(1) + +--- +### Question +What is the minimum cost of connecting all the ropes for the array [1, 2, 3, 4]? + +**Choices** +- [x] 19 +- [ ] 20 +- [ ] 10 +- [ ] 0 + + + +**Explanation**: + +**Always pick two of the smallest ropes and combine them.** + +After combining the two smallest ropes at every step, we need to sort an array again to get the two minimum-length ropes. + +1, 2, 3, 4; cost = 3 +3, 3, 4; sort: 3, 3, 4; cost = 6 +6, 4; sort: 4, 6; cost = 10 + +Final Length: 10 +Total Cost = (3 + 6 + 10) = 19 + + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Connecting the ropes optimisation + + +Heaps efficiently perform the necessary operations: + +- Insertion of elements in **`O(log n)`** time. +- Extraction of the minimum element in **`O(log n)`** time. + +**`NOTE: We'll understand how we can achive the above complexities, for now assume heap to be a black box solving the above requirements for us in lesser time.`** + +Heap returns the min or max value depending upon it is a min heap or max heap. + +Say, for above problem, we use a min heap. At every step, it will give us the 2 small length ropes. Please note below steps for solving above problem. + + + +#### Time & Space Complexity +For every operation, we are removing 2 elements and inserting one back, hence it is 3 * log N. For N operations, **`the time complexity will be O(N * log N)`** + +**`Space Complexity is O(N)`** + +--- +## Heap Data Structure + +The heap data structure is a binary tree with two special properties. +- First property is based on structure. + - **Complete Binary Tree:** All levels are completely filled. The last level can be the exception but is should also be filled from left to right. +- Second property is based on the order of elements. + - **Heap Order Property:** In the case of max heap, the value of the parent is greater than the value of the children. And in the case of min heap, the value of the parent is less than the value of the children. + + +**Examples** + +**`Example 1:`** + + + +- This is the complete binary tree as all the levels are filled and the last level is filled from left to right. +- Heap Order Property is also valid at every point in the tree, as 5 is less than 12 and 20, 12 is less than 25 and 13, 20 is less than 24 and 22, 25 is less than 35 and 34. +- Hence, it is a **min-heap** + + +**`Example 2:`** + + + +- This is the complete binary tree as all the levels are filled and the last level is filled from left to right. +- Heap Order Property is also valid at every point in the tree, as 58 is greater than 39 and 26, 39 is greater than 34 and 12, 26 is greater than 3 and 9, 34 is greater than 16 and 1. +- Hence, it is a **max-heap.** + +--- +### Array Implementation of Trees(Complete Binary Tree) + + + + +- We shall store elements in the array in level order wise. +- Such an array representation of tree is only possible if it is a complete binary tree. + + + +- Index 0 has its children at index 1 and 2 +- Index 1 has its children at index 3 and 4 +- Index 2 has its children at index 5 and 6 +- Index 3 has its children at index 7 and 8 + +**`For the particular node stored at the i index, the left child is at (i * 2 + 1 ) and the right child is at (i * 2 + 2 )`**. + +**`For any node i, its parent is at (i-1)/2.`** + + + +--- +### Insertion in min heap + + + + +|0|1|2|3|4|5|6|7| +|-|-|-|-|-|-|-|-| +|5|12|20|25|13|24|22|35| + + +**Example 1**: Insert 10 + +In an array, if we will insert 10 at index 8, then our array becomes, + +|0|1|2|3|4|5|6|7|8| +|-|-|-|-|-|-|-|-|-| +|5|12|20|25|13|24|22|35|10| + + + +And the tree becomes, + + + +Now tree satisfies the complete binary tree property but the tree does not satisfy the min-heap property, as here 25 > 10. + +In this case, we shall start with the inserted node and compare the parent with the child and keep swapping until the property is satisfied. + +Let us assume the node inserted at index `i` and the index of its parent is `pi`. +```cpp +if(arr[pi] > arr[i]) swap +``` + +> i = 8 +pi = (8-1)/2 = 3 +Since, (arr[3] > arr[8]) swap + + + +|0|1|2|3|4|5|6|7|8| +|-|-|-|-|-|-|-|-|-| +|5|12|20|10|13|24|22|35|25| + + + +Now again we need to confirm whether the heap order property is satisfied or not by checking with its parent again. + +> i = 3 +pi = (3-1)/2 = 1 +Since, (arr[1] > arr[3]) swap + + + +|0|1|2|3|4|5|6|7|8| +|-|-|-|-|-|-|-|-|-| +|5|10|20|12|13|24|22|35|25| + +Now again we need to confirm whether the heap order property is satisfied or not by checking with its parent again. + +> i = 1 +pi = (3-1)/2 = 0 +Since, (arr[0] < arr[1]) no need to swap + +STOP + +Now this tree satisfies the min-heap order property. +|0|1|2|3|4|5|6|7|8| +|-|-|-|-|-|-|-|-|-| +|5|10|20|12|13|24|22|35|25| + + + +**Example 2**: Insert 3 + +First insert 3 at index 9. + +|0|1|2|3|4|5|6|7|8|9| +|-|-|-|-|-|-|-|-|-|-| +|5|10|20|12|13|24|22|35|25|3| + +- Compare index 9 and parent index ((9-1)/2)= 4 value, as arr[4] > arr[9], swap. +- Now again compare index 4 and , parent index((4-1)/2)=1 arr[1]>arr[4], swap again. +- Now again compare index 1 and , parent index((1-1)/2)=0 arr[0]>arr[1], swap again. +- Now zero index does not have any parent so stop. + + + + +|0|1|2|3|4|5|6|7|8|9| +|-|-|-|-|-|-|-|-|-|-| +|3|5|20|12|10|24|22|35|25|13| + + +**`NOTE: The maximum swap we can perform for any element to be inserted is equal to the height of the tree.`** + +--- +### Question + +Time Complexity of inserting an element in a heap having n nodes? + +**Choices** + +- [ ] O(1) +- [x] O(log n) +- [ ] O(sqrt n) +- [ ] O(n) + + +--- +### Inserting in min heap pseudocode +#### Pseudocode +```cpp +heap[]; +heap.insert(val); // inserting at last +i = heap.size - 1; +while (i > 0) { + pi = (i - 1) / 2; + if (heap[pi] > heap[i]) { + swap(heap, pi, i); + i = pi; + } else { + break; + } +} +``` + +#### Complexity +**Time Complexity:** O(height of tree) = O(logN) + + +--- +### Extract Min + + +**`Min Heap -`** + + +|0|1|2|3|4|5|6|7|8| +|-|-|-|-|-|-|-|-|-| +|2|4|5|11|6|7|8|20|12| + + +In this tree, we have a minimum element at the root. First we swap the first and last elements, then remove the last index element of an array virtually, i.e. consider your array from index 0 to N-2. + + + + + +But the tree is not satisfying the heap-order property. To regain this heap-order property, first check 12, 4 and 5, the minimum is 4, so swap 12 with 4. + + + +- Now check the index 1(12) value, it greater than index 3(11) and index 4(6), so we need to swap this value with the minimum of left and right child i.e. 6. + + + +- Now index 4(12) does not have any child, so we will stop here. **`Now the heap-order property is regained.`** + + + +**`NOTE to Instructor: Perform extract-min again for more clarity on above tree.`** + + +#### Pseudocode +```cpp +swap(heap, 0, heap - size() - 1) +heap.remove(heap.size() - 1) +heapify(heap[], 0); + +void heapify(heap[], i) { + while (2 i + 1 < N) { //need to handle the edge case when left child is there but not the right child + x = min(heap[i], heap[2 i + 1], heap[2 i + 2]) + + if (x == heap[i]) { + break + } else if (x == heap[2 i + 1]) { + swap(heap, i, 2 i + 1) + i = 2 i + 1 + } else { + swap(heap, i, 2 i + 2) + i = 2 i + 2 + } + } +} +``` + + +#### Complexity +**Time Complexity:** O(log N) + + +--- +### Build a heap + +We have an array of values, we want to make a heap of it. +**`[5, 13, -2, 11, 27, 31, 0, 19]`** + +#### Idea 1 +Sort the array. +[-2, 0, 5, 11, 13, 19, 27, 31] + +Looking at the tree below, we can see this is a heap. + + + + +**`Time Complexity: O(N * logN)`** + + +#### Idea 2 +Call insert(arr[i]) for every element of an array. + +**Explanation:** +When insert(val) is called, at every insert we shall make sure heap property is being satisfied. + +It will take N * logN, as for each element, we will take O(log N) as heapify shall be called. + +**`Time Complexity:O(N * logN)`** + +-- +### Build a heap Idea 3 + +#### Idea to build in linear time + +We have an array +**`[7, 3, 5, 1, 6, 8, 10, 2, 13, 14, -2]`** + +We can represent this array in the form of a tree. + + + +- In the above tree, the heap-order property is automatically valid for the leaf node, hence no need to heapify them. +- Rather, we shall start with the first non-leaf node. +- The first non-leaf is nothing but the parent of the last leaf node of the tree and the index of the last node is $n-1$, so the index of the first non-leaf is $((n-1-1)/2)=((n-2)/2)=(n/2)-1$. +- We will call heapify() starting from for $(n/2)-1$ index to index 0. + +```cpp +for (int i = (n / 2) - 1; i >= 0; i--) { + heapify(heap[], i); +} +``` + + +- Firstly it will call for i = 4(6), `heapfiy(heap[], 4)`, minimum of 6, 14, -2 is -2 so 6 and -2 will be swapped. + + + - Now 6 does not have any children so we will stop here. + +- Call heapify for i = 3(1), now we will check minimum of 1, 2, 13 is 1, so here min-heap property is already satisfied. + +- Call heapify for i = 2(5), minimum of 5, 8, 10 is 5 and it is at index 2, so here min-heap property is already satisfied. + +- Call heapify for i = 1, minimum of 3, 1, -2 is -2 and so swap. + + + - Now we will again check for 3, and 3 is less than 14 and 6, so here heap-order property is valid here. + +- Call heapify for i = 0, here also heap-order property is not satisfied as -2 is less than 7, so swap. + + + - Now again check for 7, here minimum of 7, 1 and 3 is 1, so again swap it. + + + + - Now again check for minimum of 7, 2 and 13 is 2, so again swap it. + + +- Now 7 does not have any child so stop here. +- Now all the nodes has valid heap-order property. + + +#### Time Complexity + + + +Total Number of elements in tree = N +Elements at last level = N/2 + + + +- We are not calling heapify() for the last level(leaf node), So for the leaf node, total swaps are 0. +- For the last second level, we have N/4 nodes and at maximum, there can be 1 swap for these nodes i.e. with the last level. +- And maximum swaps for N/8 level nodes 2. +- Similar, for the root node, maximum swaps can be equal to the height of the tree. + + + + + + +Here it is an Arithmetic Geometric progression. We need to find the sum of + + +Multiply both sides by 1/2 + + +Now subtract the above two equations + + + +Here we are using the formula of the sum of GP. + +And put the value of the sum in this equation + + +Then +(N/2) * 2 +Here both will cancel out with each other and so our overall time complexity for building a heap is **O(N)** + +--- +### Question +What is the time complexity for building a heap with N nodes? + +**Choices** +- [ ] O(1) +- [ ] O(N$^2$) +- [x] O(N) +- [ ] O(logN) + + + +--- + + +### Merge N-sorted arrays +a - [2, 3, 11, 15, 20] +b - [1, 5, 7, 9] +c - [0, 2, 4] +d - [3, 4, 5, 6, 7, 8] +e - [-2, 5, 10, 20] + +We have to merge these sorted arrays. + +#### Idea +- If we want to merge two sorted arrays then we need two pointers. +- If we want to merge three sorted arrays then we need three pointers. +- If we want to merge N sorted arrays then we need N pointers, in which complexity becomes very high and we need to keep track of N pointers. + +--- +### Question +For merging N sorted arrays, which data structure would be the most efficient for this task ? + +**Choices** +- [ ] Linked List +- [ ] Array +- [x] Min-Heap +- [ ] Hash Table + +**Explanation:** + +A Min-Heap is an efficient data structure choice. The Min-Heap ensures that the smallest element among all the elements in the arrays is always at the front. This allows for constant-time access to the minimum element, making it efficient to extract and merge elements in sorted order. + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +#### Optimized Solution +- First, we need to compare the 0th index element of every array. +- Now we use heap here. +- We will add an index 0 element of every array in the heap, in the form of element value, array number and Index of the element in particular. + + + +Now take the minimum element and insert it in the resultant array, + +- Now insert the next element of the list for which the minimum element is selected, like first, we have taken the fourth list element, so now insert the next element of the fourth list. + + + +- Now again extract-min() from the heap and insert the next element of that list to which the minimum element belongs. +- And keep repeating this until we have done with all the elements. + +#### Time Complexity +**Time Complexity:** (XlogN) +Here X is a total number of elements of all arrays. \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Heaps 2 Problems.md b/Academy DSA Typed Notes/Advanced/DSA Heaps 2 Problems.md new file mode 100644 index 0000000..1f2099f --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Heaps 2 Problems.md @@ -0,0 +1,567 @@ +# Advanced DSA: Heaps 2: Problems + +--- +## Problem 1 Sort an Array + +We want to sort an array in increasing order using a heap. + + + +### Idea +We can use min-heap, and we need to call `extract-min()`/`remove(`) repeatedly many times, `extract-min()` will every time give the minimum element among all the available elements. +1. Build a min-heap. +2. `extract-min()` and store the returned value in the `ans` array until all the elements are not deleted. + + +--- +### Question + +What is the time Complexity to convert an array to a heap? + +**Choices** + +- [ ] O(1) +- [ ] O(log n) +- [x] O(n) +- [ ] O(nlog(n)) + + + +--- +### Question +Root element in a heap is ? + +**Choices** +- [ ] min element of the array +- [ ] max element of the array +- [x] either min or max depending upon whether it is min or max heap +- [ ] random element of the array + +**Explanation**: + +Either min or max depending upon whether it is min or max heap. Min-Heap has minimum element at the root node, where as Max-Heap has maximum element at the root node. + + + +--- +### Sort an Array Complexity and Solution Approach + +#### Complexity of sorting an array using heap +1. Build a min-heap -> **Complexity:** `O(n)` +2. `extract-min()` and store the returned value in the `ans` array until all the elements are not deleted. +3. Complexity of `extract-min()` is `O(logn)` and we are calling `N` times, so the overall complexity is `O(NlogN)`. + +#### Complexity +- **Time Complexity:** O(NlogN) +- **Space Complexity:** O(N), as we are using another array for building the heap. + +#### Can we optimize the space complexity? + +**`Hint: Try to solve by using `max-heap`.`** + +- Let us take an example of `max-heap` + +> + +- Create an array for this max-heap. + +> + +- Say, we extract an element, which element will we get? The Maximum! +Now, the maximum element can be swapped with the last index. This way, maximum element will come at its correct position in sorted array. + +> + +- Now we will virtually remove the last element, which means we consider an array till the second last element of an array. + +- Now, since the tree is not satisfying the heap order property, so we will call `heapify()` for index 0. + +- So when we call `heapify()`, firstly 3 is swapped with 13(maximum of 13 and 10). + +> + +- Now again 3 is swapped with 7. + +> + +- Now 3 is the maximum among 3, 2 and 1. Hence, no further swaps are needed. +Now we have an array, + +> + +- As we know now a maximum of all available elements is present at root, call `extract-max()`, swap maximum element with the last index element(index 8) and then we will call heapify for the value 1. + +> + +- 1 is swapped with 10, then swapped with 8, after that 1 will reach to its correct position. + +> + +- Again extract the maximum and swap it with the last(7th) index element. Then call Heapify for it. + +In this way, repeat these steps we completed with all the elements of the tree. + + +--- +### Sort an Array PseudoCode + +#### PseudoCode +```cpp +Build max - heap-- -> TC: O(N) +j = N - 1; +while (j > 0) { + swap(A[0], A[j]); + j--; + heapify(0, arr[], j) +} +``` + +#### Complexity + +- **Time Complexity:** O(NlogN) +- **Space Complexity:** O(1), we are not taking an extra array, we are converting the max heap into sorted array. + + +#### Is heap sort an in-place sorting algorithm? +**Answer:** Yes it is in-place as we are sorting an array using heap sort in constant time in the above question. + +#### Is heap sort a stable sorting algorithm? +**Answer:** No heap sort is not stable. +**Explanation:** Heap sort is not stable because operations in the heap can change the relative order of equivalent keys. + +--- +### Problem 2 kth Largest Element + +Given arr[N], find the kth largest element. + + +**Example** +**Input:** +arr[] = [8, 5, 1, 2, 4, 9, 7] +k = 3 + + +**Output:** +7 + +**Explanation:** +In the above array, +- First largest element = 9 +- Second largest element = 8 +- Third largest element = 7 + +We need to return the third largest element. + + +--- +### Question + +What is the 5th largest element of an array `[1, 2, 3, 4, 5]`? + +**Choices** + +- [ ] 5 +- [ ] 3 +- [x] 1 +- [ ] 2 + + +**Explanation** +In the above array, +- First largest element = 5 +- Second largest element = 4 +- Third largest element = 3 +- Fourth largest element = 2 +- Fifth largest element = 1 + +We need to return the fifth largest element. + + +--- +### kth Largest Element solution approach + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### :bulb: Idea 1(by sorting) +Sort an array and simply return arr[N-K]. + +**Example:** +arr[] = [8, 5, 1, 2, 4, 9, 7] +k = 3 + +**Solution** +Sort an array, [1, 2, 4, 5, 7, 8, 9] +Now return arr[N-K] element i.e. arr[7-3] = arr[4] = 7 + +**Time Complexity:** O(NlogN), **Space Complexity:** O(1). + +### :bulb: Idea 2(Using binary search) + +We can find the kth largest element by applying binary search just like we have used in the kth smallest element. +**Time Complexity:** O(Nlog(max-min)) + +### :bulb: Idea 3(Using heap sort) + +1. Build a max-heap. +2. Call extract-max() k-1 times to remove K-1 elements(for first largest we need zero removals, for second largest we need 1 removal, in this way for kth largest we need k-1 removals) + +### Complexity +**Time Complexity:** O(N + KlogN) +**Space Complexity:** O(1) + +--- +### kth Largest Element Using min-heap + +### :bulb: Idea 4(Using min-heap) + +Let us take an example, we want to create a cricket team of 4 batsmen and we have 8 batsmen i.e. b1, b2, b3, b4, b5, b6, b7 and b8, and every batsman is given only 1 over and everyone tries to achieve maximum run in that over. + +Firstly, 4 batsmen played and scored +|b1|b2|b3|b4| +|-|-|-|-| +|12|8|4|6| + +We have recently incorporated four batsmen into our team with respective scores of **`12, 8, 4, and 6`**. When batsman **`B5 joins, scoring 7`**, we opt to replace the player with the lowest score to maintain team quality. Since we use a min heap to track scores, we **`remove the batsman with a score of 4 and include B5`**, updating our heap to **[12, 8, 7, 6]**. + +Later, batsman **`B6 arrives, earning 3 runs`**. However, his score **`doesn't surpass our team's minimum`**, so he isn't added. Then, batsman **`B7 steps in, scoring a notable 10 runs`**. Outperforming our lowest score, **`B7's addition leads us to drop the current minimum`** scorer and update the heap to **[12, 8, 7, 10]**. + +Following this, batsman **`B8 enters with a score of 9`**. Exceeding the lowest score in our lineup, we **`incorporate B8 by removing the now lowest scorer`**, refining our heap to **[12, 8, 9, 10]**. + +Thus, in this dynamic team selection process, the minimum element in our heap represents the fourth-highest score among our players. + +#### Example: +To find the 3rd largest element in an array using a min-heap of size 3: + +Given array: **`arr = [8, 5, 1, 2, 4, 9, 7] and k=3`**. + +- Initialize an empty min-heap. +- Add the first three elements of the array to the heap: [8, 5, 1]. +- Iterate over the remaining elements. If an element is greater than the heap's minimum, remove the minimum and insert the new element. +- After processing elements 2, 4, 9, and 7, the heap evolves as follows: + - [8, 5, 2] (after adding 2) + - [8, 5, 4] (after adding 4) + - [8, 5, 9] (after adding 9) + - [8, 7, 9] (after adding 7) +- The 3rd largest element is the minimum in the heap: 7. + +#### PseudoCode +```cpp +Build min-heap with first k elements. -> O(K) +Iterate on the remaining elements. -> (N-K) + for every element, check + if(curr element > min element in heap){ + extractMin() + insert(current element) + } +ans = getMin() +``` + +#### Complexity +- **Time Complexity:** O(K+(N-K)logK) +- **Space Complexity:** O(K) + +:bulb: What should we use for finding k-th smallest? +- A max-heap of size K. + + +--- +### Problem 2 kth Largest Element for all windows + +Find the kth largest element for all the windows of an array starting from 0 index. + +**Example** +**Input:** +arr[] = `[10, 18, 7, 5, 16, 19, 3]` +k = 3 + + +**Solution:** + +- We need atleast 3 elements in a window, so we will consider first window from index 0 to k-1, we have elements in that `[10, 18, 7]`; third largest is 7, ans=`[7]`. +- Window 0 to 3 `[10, 18, 7, 5]`,third largest = 7, ans=`[7, 7]`. +- Window 0 to 4 `[10, 18, 7, 5, 16]`,third largest = 10, ans=`[7, 7, 10]`. +- Window 0 to 5 `[10, 18, 7, 5, 16, 19]`,third largest = 16, ans=`[7, 7, 10, 16]`. +- Window 0 to 6 `[10, 18, 7, 5, 16, 19, 3]`,third largest = 16, ans=`[7, 7, 10, 16, 16]`. + +--- +### Question +Find the kth largest element for all the windows of an array starting from 0 index. + +arr[] = `[5, 4, 1, 6, 7]` +k = 2 + +**Choices** +- [x] [4, 4, 5, 6] +- [ ] [6, 6, 6, 6] +- [ ] [5, 4, 1, 6] +- [ ] [4, 1, 6, 7] + + + +**Explanation**: +To find the second largest element in each window of a given size in an array: + +- Start with the first window (from index 0 to k-1). For example, in [5, 4], the second largest is 4. Answer array starts as [4]. +- Shift the window one element at a time and find the second largest in each new window. + - Window [5, 4, 1] gives second largest 4. Answer array becomes [4, 4]. + - Window [5, 4, 1, 6] gives second largest 5. Answer array becomes [4, 4, 5]. + - Window [5, 4, 1, 6, 7] gives second largest 6. Answer array becomes [4, 4, 5, 6]. + +--- +### kth Largest Element for all windows Idea + +To find the k-largest elements in an array using a min-heap: + +- **Initialize Min-Heap**: Start with a min-heap and add the first k elements from the array to it. +- **Compare and Update**: For each remaining array element, if it's larger than the heap's minimum, replace the minimum with this element. +- **Track Minimums**: After each update, record the heap's minimum. This shows the evolving k-th largest element. + +#### Pseudocode +```java +Build min-heap with first K elements. -> O(K) +ans.add(extractMin()) + +Iterate on the remaining elements. -> (N-K) + for every element, check { + if(curr element > min element in heap){ + extractMin() + insert(current element) + ans.add(extractMin()) + } + } +``` + +--- +### Problem 3 Sort the nearly sorted array + + +Given a nearly sorted array. You need to sort the array. + +> Nearly sorted array definition - Every element is shifted away from its correct position by at most k-steps. + +**Example** +Sorted array can be `[11, 13, 20, 22, 31, 45, 48, 50, 60]` +We are given, +**Input:** +arr[] = `[13, 22, 31, 45, 11, 20, 48, 60, 50]` +k = 4 + +Every element is not more than 4 distance away from its position. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### :bulb: Idea 1(Sorting) +Sort an Array +**Time Complexity:** O(NlogN) + +#### :bulb: Idea 2 + +An element can be shifted by at most k steps, so the **`element at index 0 can only be shifted till index (k)`**, so the **`minimum element lies from index 0 to k`**. +- So we need to choose a minimum of first k+1 elements. +- We will take a min-heap of size k+1. +- Add first k+1 elements into a heap, heap = `[13, 22, 31, 45, 11]`. +- extractMin()(heap = `[13, 22, 31, 45]`) will give a first element of a sorted array, ans = `[11]`, now add the next element from an input array, into a heap, heap = `[13, 22, 31, 45, 20]`. +- Again extractMin(), it will give a second of a sorted array, ans = `[11, 13]`, again add the next element of the input array, again extractMin(), in this way do until we reach the last index, and then remove minimum element from array one-by-one and add it to ans array. + + +#### PseudoCode +```cpp +1. build min-heap with the first (k + 1) elements. +2. for(i = k + 1 ; i < N ; i ++){ + extractMin(); -> put it into ans[] array + insert( arr[i] ) + } + while(minHeap is not empty){ + extractMin() -> put it into ans[] array + } +3. return ans; +``` + +#### Compexity +**Time Complexity:** O(K + N.logK) +**Space Complexity:** O(K) + + +--- +### Flipkart's Delivery Time Estimation Challenge + + +*Flipkart is currently dealing with the difficulty of precisely estimating and displaying the expected delivery time for orders to a specific pin code.* + +*The existing method relies on historical delivery time data for that pin code, using the median value as the expected delivery time.* + +*As the order history expands with new entries, Flipkart aims to enhance this process by dynamically updating the expected delivery time whenever a new delivery time is added. The objective is to find the expected delivery time after each new element is incorporated into the list of delivery times.* + +**End Goal:** With every addition of new delivery time, requirement is to find the median value. + +**Why Median ?** +The median is calculated because it provides a more robust measure of the expected delivery time + +The median is less sensitive to outliers or extreme values than the mean. In the context of delivery times, this is crucial because occasional delays or unusually fast deliveries (outliers) can skew the mean significantly, leading to inaccurate estimations. + +--- +### Problem 4 Find the median + +Given an infinite stream of integers. Find the median of the current set of elements + +>### Median +>Median is the Middle element in a sorted array. + +>The median of [1, 2, 5, 4, 3, 6] +First, we need to sort an array [1, 2, 3, 4, 5, 6] +We have two middle values as the size of the array is even i.e. 3, 4. +So to find the median, we need to take the average of both middle values, median = (3+4)/2 = 3.5 + +--- +### Question + +The median of [1, 2, 4, 3] + +**Choices** + +- [ ] 2 +- [ ] 4 +- [ ] 3 +- [x] 2.5 + +**Explanation**: + +The median of [1, 2, 4, 3] +First, we need to sort an array [1, 2, 3, 4] +We have two middle values as the size of the array is even i.e. 2, 3. +So to find the median, we need to take the average of both middle values, + +Median = (2+3)/2 = 2.5 + +--- +### Find the median Brute Force Approach + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Understanding the question +We have an infinite stream of elements. +1. First we have one element. +6, then median = 6. +2. Next element if 3 +6, 3, then median = 4.5 +3. 6, 3, 8, then median = 6 +4. 6, 3, 8, 11, then median = 7 +5. 6, 3, 8, 11, 10 then median = 8 + + +#### Brute Force Idea +For every incoming value, include the value and sort an array. Find the middle point/average of 2 middle points. +**Time Complexity:** O(N^2^logN) + + +--- +### Find the median solution approach + +#### Idea(Using Insertion Sort) +Every time find the correct position of the upcoming element i.e. Insertion Sort + +**Time Complexity:** O(N^2^) + +#### Idea(Using heap) + +To find the median in an array by dividing it into two parts - one with smaller elements and the other with larger elements: + +Consider an array, **`for example, [6, 3, 8, 11]`**. We divide it such that **`6, 3 are on the smaller side`** and **`8, 11 on the larger side`**, as shown in the image: + + +To find the median: + +- If both sides have an equal number of elements, take the average of the largest element on the smaller side and the smallest element on the larger side. +- If the sizes are unequal, choose the largest element from the smaller side if it's larger, or the smallest from the larger side otherwise. + +**The key is to use two heaps:** a min-heap for the larger elements and a max-heap for the smaller elements. This approach maintains a balanced partition of the array for efficient median calculation. + +**Example** +arr = [6, 3, 8, 11, 20, 2, 10, 8, 13, 50, _ _ _ ] + +Take two heaps, min-heap and max-heap + + +Smaller side elements are stored in max-heap and Greater side elements are stored in min-heap + + +1. First element is 6, simply add it in max-heap + +**The median is 6.** + + +2. Second element is 3; compare with h1.getMax(), if 3<6 then it must be included in h1. + +but now both the heaps do not have half-half elements. Remove the maximum element from max-heap and insert it into h2. + +Now we have an equal number of elements in both heaps, so the median is the average of the largest value of h1 and the smallest value of h2. +**Median is 4.5** + + +3. Next element is 8. +Compare it with h1.getMax(), 8>3 so 8 will go to h2. + +size(h2) is greater by 1 +**Median is 6** + + +4. Next element is 11. +Compare it with h1.getMax(), 11>3 so 11 will go to h2. + +But now both heap does not have nearly half elements. +So remove the minimum element and add it to h1. + +**Median is average of 6,8 = (6+8)/2 = 7** + + +5. Next element is 20. +Compare it with h1.getMax(), 20>6 so 20 will go to h2. + +size(h2) is greater by 1 +**The median is 8.** + +In this way we will do for all the elements of an array, and find the median at every step, we need to take care that the |h1.size()-h2.size()|<=1. + +After adding all the medians in an array, we will get an answer: [6, 4.5, 6, 7, 8, 7, 8, 8, 8, _ _ _ ] + + +--- +#### PseudoCode +```cpp + h1, h2 + h1.insert(arr[0]) + print(arr[0]) + for (int i = 1; i < N; i++) { + if (arr[i] > h1.getMax()) { + h2.insert(arr[i]); + } else { + h1.insert(arr[i]); + } + diff = | h1.size() - h2.size() | + if (diff > 1) { + if (h1.size() > h2.size()) { + h2.insert(h1.getMax()); + } else { + h1.insert(h2.getMin()); + } + } + if (h1.size() > h2.size()) { + print(h1.getMax()); + } else if (h2.size() > h1.size()) { + print(h2.getMin()) + } else { + print((h1.getMax() + h2.getMin()) / 2.0); + } + } +``` + +#### Complexity + +**Time Complexity:** O(NlogN) +**Space Complexity:** O(N) diff --git a/Academy DSA Typed Notes/Advanced/DSA Interview Problems.md b/Academy DSA Typed Notes/Advanced/DSA Interview Problems.md new file mode 100644 index 0000000..f78bae7 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Interview Problems.md @@ -0,0 +1,351 @@ +# DSA 4 - Interview Problems + +--- +### Problem 1 Target Sum + +You are given a set of non-negative integers and a target sum. The task is to determine whether there exists a subset of the given set whose sum is equal to the target sum. + + +**Examples** +**Input**: set = {3, 34, 4, 12, 5, 2}, sum = 9 +**Output**: True +**Explanation**: There is a subset (4, 5) with a sum of 9. + +:::warning +Please take some time to think about the brute force approach on your own before reading further..... +::: + +#### Approach: Brute Force +The brute force approach involves exploring all possible subsets of the given set. This is achieved through a recursive function named isSubsetSum(set, n, sum). The function explores two possibilities for each element: including it in the subset or excluding it. The base cases check if the sum is zero or if there are no more elements to consider. + + +#### Code +```java +boolean isSubsetSum(int[] set, int n, int sum) { + if (sum == 0) return true; + if (n == 0 && sum != 0) return false; + + // Explore two possibilities: include the current element or exclude it + return isSubsetSum(set, n - 1, sum) || isSubsetSum(set, n - 1, sum - set[n - 1]); +} + +``` + +#### Complexity Analysis +* **Time complexity**: O(2^n) - Exponential +* **Space complexity**: O(1) + +--- +### Target Sum Dynamic Programming Approach +#### Approach: +To optimize the solution, dynamic programming is employed. A 2D array `dp` is used to store results of subproblems. The value `dp[i][j]` represents whether it's possible to obtain a sum of `j` using the first `i` elements of the set. + +#### Code +```java +boolean isSubsetSum(int[] set, int n, int sum) { + boolean[][] dp = new boolean[n + 1][sum + 1]; + + // Initialize the first column as true, as sum 0 is always possible + for (int i = 0; i <= n; i++) dp[i][0] = true; + + // Fill the dp array using a bottom-up approach + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= sum; j++) { + dp[i][j] = dp[i - 1][j]; + if (j >= set[i - 1]) dp[i][j] = dp[i][j] || dp[i - 1][j - set[i - 1]]; + } + } + + return dp[n][sum]; +} + +``` + +#### Complexity Analysis +* **Time complexity**: O(n * sum) +* **Space complexity**: O(n * sum) + +--- +### Problem 2 Minimum Jumps to Reach End + +You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0]. + +Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], you can jump to any nums[i + j] where: +* 0 <= j <= nums[i] +* i + j < n + +Return the minimum number of jumps to reach nums[n - 1]. The test cases are generated such that you can reach nums[n - 1]. + + +#### Example 1 +**Input**: nums = [2,3,1,1,4] +**Output**: 2 +**Explanation**: The minimum number of jumps to reach the last index is 2. Jump 1 step from index 0 to 1, then 3 steps to the last index. + +#### Example 2 +**Input**: nums = [2,3,0,1,4] +**Output**: 2 + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Intuition + +The code utilizes a greedy approach, aiming to minimize the number of jumps by selecting the jump that maximizes the range of reachable positions at each step. + +#### Approach +* Initialize a counter to keep track of the number of jumps (counter). +* Use a while loop to iterate through the array until the end is reached. +* In each iteration: + * Calculate the range of positions that can be reached from the current position (range). + * If the calculated range includes the last position or exceeds it, exit the loop. + * Find the position within the current range that maximizes the next reachable position (temp). + * Update the current position to the selected position (temp). + * Increment the jump counter (counter). +* Repeat the process until the end is reached. + +#### Code +```java +class Solution { + public int jump(int[] nums) { + int i = 0; + int counter = 0; + + // If the array has only one element, no jumps are needed + if (nums.length == 1) + return 0; + + while (i < nums.length) { + counter++; + int range = i + nums[i]; + + // If the range includes the last position or exceeds it, exit the loop + if (range >= nums.length - 1) + break; + + int max = 0; + int temp = 0; + + // Find the position within the current range that maximizes the next reachable position + for (int k = i + 1; k <= range; k++) { + if (nums[k] + k >= max) { + max = nums[k] + k; + temp = k; + } + } + i = temp; + } + return counter; + } +} + +``` + +#### Complexity Analysis +**Time complexity**: O(n) +* The algorithm iterates through each element of the array once. +* The inner loop within each iteration also traverses a limited number of positions. + +**Space complexity**: O(1) +* The algorithm uses a constant amount of extra space. +* The space requirements do not depend on the size of the input array. + +--- +### Problem 3 N digit numbers + +Find out the number of A digit positive numbers, whose digits on being added equals to a given number B. + +Note that a valid number starts from digits 1-9 except the number 0 itself. i.e. leading zeroes are not allowed. + +Since the answer can be large, output answer modulo 1000000007 + +:::warning +Please take some time to think about the brute force approach on your own before reading further..... +::: + +### Brute Force Approach +#### Objective +Count the number of A-digit positive numbers whose digit sum equals a given number B. + +#### Idea +* Generate all possible A-digit numbers +* For each number, check if the sum of its digits equals B. +* Keep track of the count of valid numbers. + + +#### Code +```cpp +int bruteForceCount(int A, int B) { + int count = 0; + for (int num = pow(10, A - 1); num < pow(10, A); ++num) { + int digitSum = 0; + int temp = num; + while (temp > 0) { + digitSum += temp % 10; + temp /= 10; + } + if (digitSum == B) { + count++; + } + } + return count; +} +``` + +--- +### N digit numbers optimization using Recursion +#### Observation +The brute force approach involves iterating through all A digit numbers and checking the count of numbers whose digit sum equals B. + +#### Optimized Recursive Approach + +**Recursive Function Definition** + +* The recursive function `countWays(id, sum)` is defined to represent the count of A-digit numbers with a digit sum equal to sum. +* The base cases are as follows: + * If sum becomes negative, it implies that the digit sum has exceeded the target, so the count is 0. + * If id becomes 0, meaning all digits have been considered, the count is 1 if sum is 0 (indicating the target sum has been achieved), and 0 otherwise. + * Memoization is used to store and retrieve previously calculated values, preventing redundant computations. + +**Memoization Table** + +* The memo vector is a 2D table of size (A + 1) x (B + 1) initialized with -1 to represent uncalculated states. +* The value `memo[id][sum]` stores the count of A-digit numbers with a digit sum of sum that has already been calculated. + + +**Recursive Part** + +* The function explores all possible digits from 0 to 9 in a loop. +* For each digit, it recursively calls `countWays(id - 1, sum - digit, memo)` to calculate the count of (A-1)-digit numbers with the updated digit sum. +* The results are summed up, and the modulus operation is applied to avoid integer overflow. + + +#### Optimized Recursive Code + +```cpp +int memoizationCount(int A, int B) { + vector> memo(A + 1, vector(B + 1, -1)); + return countWays(A, B, memo); +} + +int countWays(int id, int sum, vector>& memo) { + if (sum < 0) return 0; + if (id == 0) return (sum == 0) ? 1 : 0; + if (memo[id][sum] != -1) return memo[id][sum]; + + int ways = 0; + for (int digit = 0; digit <= 9; ++digit) { + ways += countWays(id - 1, sum - digit, memo); + ways %= 1000000007; + } + return memo[id][sum] = ways; +} +``` + +#### Optimized Iterative Code +```cpp +int iterativeCount(int A, int B) { + vector> dp(A + 1, vector(B + 1, 0)); + + // Base case + for (int digit = 1; digit <= 9; ++digit) { + if (digit <= B) dp[1][digit] = 1; + } + + // Build DP table + for (int id = 2; id <= A; ++id) { + for (int sum = 1; sum <= B; ++sum) { + for (int digit = 1; digit <= 9; ++digit) { + if (sum - digit >= 0) { + dp[id][sum] += dp[id - 1][sum - digit]; + dp[id][sum] %= 1000000007; + } + } + } + } + + return dp[A][B]; +} +``` + +**Time Complexity** : O(A * B) +**Space Complexity** : O(A * B) + + +--- +### Problem 4 Maximum Profit from Stock Prices + +Given an array A where the i-th element represents the price of a stock on day i, the objective is to find the maximum profit. We're allowed to complete as many transactions as desired, but engaging in multiple transactions simultaneously is not allowed. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach +Let's start with some key observations: + +**Note 1**: It's never beneficial to buy a stock and sell it at a loss. This intuitive insight guides our decision-making process. + +**Note 2**: If the stock price on day i is less than the price on day i+1, it's always advantageous to buy on day i and sell on day i+1. + +Now, let's delve into the rationale behind Note 2: + +**Proof**: If the price on day i+1 is higher than the price on day i, buying on day i and selling on day i+1 ensures a profit. If we didn't sell on day i+1 and waited for day i+2 to sell, the profit would still be the same. Thus, it's optimal to sell whenever there's a price increase. + +#### DP-Based Solution +Now, let's transition to a dynamic programming solution based on the following recurrence relation: + +Let Dp[i] represent the maximum profit you can gain in the region (i, i+1, ..., n). + +**Recurrence Relation**: `Dp[i] = max(Dp[i+1], -A[i] + max(A[j] + Dp[j] for j > i))` + +Here, Dp[i] considers either continuing with the profit from the next day (Dp[i+1]) or selling on day i and adding the profit from subsequent days. + +#### Base Cases + +When i is the last day (i == n-1), Dp[i] = 0 since there are no more future days. +When i is not the last day, Dp[i] needs to be computed using the recurrence relation. + +#### Direction of Computation + +We start computing Dp[i] from the last day and move towards the first day. + +#### Code +```cpp +int max_profit(vector& A) { + int n = A.size(); + vector dp(n, 0); + + for (int i = n - 2; i >= 0; --i) { + dp[i] = dp[i + 1]; + + for (int j = i + 1; j < n; ++j) { + if (j + 1 < n) { + dp[i] = max(dp[i], -A[i] + A[j] + dp[j + 1]); + } else { + dp[i] = max(dp[i], -A[i] + A[j]); + } + } + } + + return dp[0]; +} +``` + + +#### Optimized Code +The provided code snippet in C++ contains this observation-based solution. It iterates through the array, checks for price increases, and accumulates the profits accordingly. +```cpp +int Solution::maxProfit(const vector &A) { + int total = 0, sz = A.size(); + for (int i = 0; i < sz - 1; i++) { + if (A[i + 1] > A[i]) + total += A[i + 1] - A[i]; + } + return total; +} +``` + +**Time Complexity** : O(|A|) +**Space Complexity** : O(1) diff --git a/Academy DSA Typed Notes/Advanced/DSA Language Advanced Concept Collections.md b/Academy DSA Typed Notes/Advanced/DSA Language Advanced Concept Collections.md new file mode 100644 index 0000000..488754b --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Language Advanced Concept Collections.md @@ -0,0 +1,1071 @@ +# Language Advanced Concept: Collections + +--- + +## Java Collections Framework + + +* Any group of individual objects which are represented as a single unit is known as a collection of objects. +* A framework is a set of classes and interfaces which provide a ready-made architecture. +* **The Java Collections Framework (JCF)** is a set of classes and interfaces that implement commonly reusable collection data structures like **List, Set, Queue, Map, etc**. The JCF is organized into interfaces and implementations of those interfaces. The interfaces define the functionality of the collection data structures, and the implementations provide concrete implementations of those interfaces. + +### Need for a Separate Collection Framework in Java + +* Before the Collection Framework(or before JDK 1.2) was introduced, the standard methods for grouping Java objects (or collections) were **Arrays or Vectors, or Hashtables**. +* All of these collections had no common interface. Therefore, though the main aim of all the collections is the same, the implementation of all these collections was defined independently and had no correlation among them. Hence, it is very difficult for the users to remember all the different methods, syntax, and constructors present in every collection class. +* Let’s understand this with an example of adding an element in a hashtable and a vector. + +```java +// Java program to demonstrate +// why collection framework was needed +import java.io.*; +import java.util.*; + +class CollectionDemo { + + public static void main(String[] args) + { + // Creating instances of the array, + // vector and hashtable + int arr[] = new int[] { 1, 2, 3, 4 }; + Vector v = new Vector(); + Hashtable h = new Hashtable(); + + // Adding the elements into the + // vector + v.addElement(1); + v.addElement(2); + + // Adding the element into the + // hashtable + h.put(1, "geeks"); + h.put(2, "4geeks"); + + // Array instance creation requires [], + // while Vector and hastable require () + // Vector element insertion requires addElement(), + // but hashtable element insertion requires put() + + // Accessing the first element of the + // array, vector and hashtable + System.out.println(arr[0]); + System.out.println(v.elementAt(0)); + System.out.println(h.get(1)); + + // Array elements are accessed using [], + // vector elements using elementAt() + // and hashtable elements using get() + } +} +``` + +--- + + +### Advantages of Java Collections Framework + +The advantages of using the JCF are: + +* **Consistent API** - The API has a basic set of interfaces like Collection, Set, List, or Map, all the classes (ArrayList, LinkedList, Vector, etc) that implement these interfaces have some common set of methods. +* **Reduces programming effort** - A programmer doesnʼt have to worry about the design of the Collection but rather he can focus on its best use in his program. Therefore, the basic concept of Object-oriented programming (i.e.) abstraction has been successfully implemented. +* **Increases program speed and quality** - Increases performance by providing high-performance implementations of useful data structures and algorithms because in this case, the programmer need not think of the best implementation of a specific data structure. He can simply use the best implementation to drastically boost the performance of his algorithm/program. + + +--- +### Hierarchy of the Java Collection Framework + + + +* The utility package, (java.util) contains all the classes and interfaces that are required by the collection framework. +* The collection framework contains an interface named an **iterable interface** which provides the iterator to iterate through all the collections. This interface is extended by the main collection interface which acts as a root for the collection framework. All the collections extend this collection interface thereby extending the properties of the iterator and the methods of this interface. +* In Java, Collection interface (java.util.Collection) and Map interface (java.util.Map) are the two main “root” interfaces of Java collection classes. + + + +### Iterable Interface +* This is the root interface for the entire collection framework. The collection interface extends the iterable interface. Therefore, inherently, all the interfaces and classes implement this interface. The main functionality of this interface is to provide an iterator for the collections. Therefore, this interface contains only one abstract method which is the iterator. It returns the +``` +Iterator iterator(); +``` + +--- + + +### Collection Interface + +* The Collection interface is the root interface of the Java Collections Framework. It is the foundation upon which the collection framework is built. It declares the core methods that all collections will have. The +* Collection interface is a part of the java.util package. +* The JDK does not provide any direct implementations of this interface: it provides implementations of more specific sub-interfaces like Set and List. This interface is typically used to pass collections around and manipulate them where maximum generality is desired. +* The Collection interface is not directly implemented by any class. However, it is implemented indirectly via its subtypes or subinterfaces like List, Queue, and Set. For Example, the HashSet class implements the Set interface which is a subinterface of the Collection interface. +* It implements the Iterable interface. + +### Methods of Collection Interface + +The Collection interface includes various methods that can be used to perform different operations on objects. These methods are available in all its subinterfaces. + +* **add()** - inserts the specified element to the collection +* **size()** - returns the size of the collection +* **remove()** - removes the specified element from the collection +* **iterator()** - returns an iterator to access elements of the collection +* **addAll()** - adds all the elements of a specified collection to the collection +* **removeAll()** - removes all the elements of the specified collection from the collection +* **clear()** - removes all the elements of the collection + + +--- + +### Interfaces that extend the Collections Interface + +We are going to learn about the following SubInterfaces that extends the Collections Interface : +1. **List :** This interface is dedicated to the data of the list type in which we can store all the ordered collection of the objects. This also allows duplicate data to be present in it. +2. **Set:** A set is an unordered collection of objects in which duplicate values cannot be stored. This collection is used when we wish to avoid the duplication of the objects and wish to store only the unique objects. +3. **SortedSet:** This interface is very similar to the set interface. The only difference is that this interface has extra methods that maintain the ordering of the elements. The sorted set interface extends the set interface and is used to handle the data which needs to be sorted. +4. **Map** : A map is a data structure that supports the key-value pair for mapping the data. This interface doesn’t support duplicate keys because the same key cannot have multiple mappings, however, it allows duplicate values in different keys. A map is useful if there is data and we wish to perform operations on the basis of the key. +5. **Queue:** As the name suggests, a queue interface maintains the FIFO(First In First Out) order similar to a real-world queue line. This interface is dedicated to storing all the elements where the order of the elements matter. For example, whenever we try to book a ticket, the tickets are sold at the first come first serve basis. Therefore, the person whose request arrives first into the queue gets the ticket. +6. **Deque:** This is a very slight variation of the queue data structure. Deque, also known as a double-ended queue, is a data structure where we can add and remove the elements from both the ends of the queue. This interface extends the queue interface. + +Let's start going through each one in details one by one. + +--- + + +### List Interface + +* The **List** interface is a child of **Collection** Interface.The List interface is found in **java.util** package and inherits the Collection interface. +* It is an ordered collection of objects in which duplicate values can be stored. Since List preserves the insertion order, it allows positional access and insertion of elements. +* The implementation classes of the List interface are ArrayList, LinkedList, Vector and Stack. ArrayList and LinkedList are widely used in Java programming. + +* ### Declaration of Java List Interface + ``` + public interface List extends Collection ; + ``` +* Since List is an interface, objects cannot be created of the type list. We always need a class that implements this List in order to create an object. +* The list interface is implemented by the following Classes : + 1. **ArrayList** - Resizable-array implementation of the List interface + 2. **Vector** - Synchronized resizable-array implementation of the List interface + 3. **Stack** - Subclass of Vector that implements a standard last-in, first-out stack + 4. **LinkedList** - Doubly-linked list implementation of the List and Deque interfaces + +Let us discuss them sequentially and implement the same to figure out the working of the classes with the List interface. + + +--- + + +### ArrayList + +* An ArrayList in Java is implemented as a resizable array, also known as a dynamic array. It provides an interface to work with a dynamically sized list of elements, allowing for efficient insertion, deletion, and random access. Here's how an ArrayList is typically implemented: + +1. **Backing Array**: The core of an ArrayList is an underlying array that holds the elements. This array is initially created with a default size, and elements are stored sequentially in it. +2. **Resizing**: As elements are added to the ArrayList, the backing array may become full. When this happens, a new larger array is created, and the existing elements are copied from the old array to the new one. This process is called resizing or resizing the array. +3. **Dynamic Sizing**: The resizing operation ensures that the ArrayList can dynamically grow or shrink in size as needed. This dynamic sizing is a key feature that differentiates it from a regular array. +4. **Index-Based Access**: ArrayList allows elements to be accessed by their index. This is achieved by directly accessing the corresponding element in the backing array using the index. +5. **Insertion and Deletion**: When an element is inserted at a specific index or removed from the ArrayList, the other elements may need to be shifted to accommodate the change. This can involve moving multiple elements within the array. +6. **Efficiency**: ArrayList provides efficient constant-time (O(1)) access to elements by index. However, insertion or deletion operations at the beginning or middle of the list may require shifting elements and take linear time (O(n)), where n is the number of elements. +7. **Automatic Resizing**: Java's ArrayList uses automatic resizing strategies to ensure that the array is appropriately resized when needed. The exact resizing strategy can vary across different implementations and versions of Java. + + +Let’s see how to create a list object using this class : + +```java +// Java program to demonstrate the +// creation of list object using the +// ArrayList class + +import java.io.*; +import java.util.*; + +class ListObjectUsingArrayList { + public static void main(String[] args) + { + // Size of ArrayList + int n = 5; + + // Declaring the List with initial size n + List arr = new ArrayList(n); + + // Appending the new elements + // at the end of the list + for (int i = 1; i <= n; i++) + arr.add(i); + + // Printing elements + System.out.println(arr); + + // Remove element at index 3 + arr.remove(3); + + // Displaying the list after deletion + System.out.println(arr); + + // Printing elements one by one + for (int i = 0; i < arr.size(); i++) + System.out.print(arr.get(i) + " "); + } +} +``` + +--- + + +### Vector + +* A vector provides us with dynamic arrays in Java. Though, it may be slower than standard arrays but can be helpful in programs where lots of manipulation in the array is needed. This is identical to ArrayList in terms of implementation. However, the primary difference between a vector and an ArrayList is that a Vector is synchronized and an ArrayList is non-synchronized. + +Let’s understand the Vector with an example: + +```java +// Java program to demonstrate the +// creation of list object using the +// Vector class + +import java.io.*; +import java.util.*; + +class ListObjectUsingVector { + public static void main(String[] args) + { + // Size of the vector + int n = 5; + + // Declaring the List with initial size n + List v = new Vector(n); + + // Appending the new elements + // at the end of the list + for (int i = 1; i <= n; i++) + v.add(i); + + // Printing elements + System.out.println(v); + + // Remove element at index 3 + v.remove(3); + + // Displaying the list after deletion + System.out.println(v); + + // Printing elements one by one + for (int i = 0; i < v.size(); i++) + System.out.print(v.get(i) + " "); + } +} +``` + +--- +## Stack + + +* Stack is a class that is implemented in the collection framework and extends the vector class models and implements the Stack data structure. The class is based on the basic principle of last-in-first-out. In addition to the basic push and pop operations, the class provides three more functions of empty, search and peek. + +Let’s see how to create a list object using this class : + +```java +// Java program to demonstrate the +// creation of list object using the +// Stack class + +import java.io.*; +import java.util.*; + +class ListObjectUsingStack { + public static void main(String[] args) + { + // Size of the stack + int n = 5; + + // Declaring the List + List stackObject = new Stack(); + + // Appending the new elements + // at the end of the list + for (int i = 1; i <= n; i++) + stackObject.add(i); + + // Printing elements + System.out.println(stackObject); + + // Remove element at index 3 + stackObject.remove(3); + + // Displaying the list after deletion + System.out.println(stackObject); + + // Printing elements one by one + for (int i = 0; i < stackObject.size(); i++) + System.out.print(stackObject.get(i) + " "); + } +} +``` + +--- +## Linked List + + +* LinkedList is a class that is implemented in the collection framework which inherently implements the **linked list data structure**. +* It is a linear data structure where the elements are not stored in contiguous locations and every element is a separate object with a data part and address part. +* The elements are linked using pointers and addresses. Each element is known as a node. Due to the dynamicity and ease of insertions and deletions, they are preferred over the arrays. + +Let’s see how to create a list object using this class : + +```java +// Java program to demonstrate the +// creation of list object using the +// LinkedList class + +import java.io.*; +import java.util.*; + +class ListObjectUsingLinkedList { + public static void main(String[] args) + { + // Size of the LinkedList + int n = 5; + + // Declaring the List with initial size n + List ll = new LinkedList(); + + // Appending the new elements + // at the end of the list + for (int i = 1; i <= n; i++) + ll.add(i); + + // Printing elements + System.out.println(ll); + + // Remove element at index 3 + ll.remove(3); + + // Displaying the list after deletion + System.out.println(ll); + + // Printing elements one by one + for (int i = 0; i < ll.size(); i++) + System.out.print(ll.get(i) + " "); + } +} +``` + +--- +## Set Interface + + +* The Set interface extends the Collection interface. It represents the unordered set of elements which doesn't allow us to store the duplicate items. +* We can store at most one null value in Set. +* This interface contains the methods inherited from the Collection interface and adds a feature that restricts the insertion of the duplicate elements. + +* ## Declaration of Set Interface : + +```java +public interface Set extends Collection +``` +* **HashSet** is one of the widely used classes which implements the Set interface. +* We will learn about the implementation of HashSet in the future classes. + +Now, let’s see how to perform a few frequently used operations on the HashSet. We are going to perform the following operations as follows: + +Adding elements +Accessing elements +Removing elements +Iterating elements +Iterating through Set + +**Adding Elements** +```java +// Java Program Demonstrating Working of Set by +// Adding elements using add() method + +// Importing all utility classes +import java.util.*; + +// Main class +class HashSetClass { + + // Main driver method + public static void main(String[] args) + { + // Creating an object of Set and + // declaring object of type String + Set hs = new HashSet(); + + // Adding elements to above object + // using add() method + hs.add("B"); + hs.add("B"); + hs.add("C"); + hs.add("A"); + + // Printing the elements inside the Set object + System.out.println(hs); + } +} +``` +**Accessing the Elements** +```java +// Java code to demonstrate Working of Set by +// Accessing the Elements of the Set object + +// Importing all utility classes +import java.util.*; + +// Main class +class HashSetClass { + + // Main driver method + public static void main(String[] args) + { + // Creating an object of Set and + // declaring object of type String + Set hs = new HashSet(); + + // Elements are added using add() method + // Later onwards we will show accessing the same + + // Custom input elements + hs.add("A"); + hs.add("B"); + hs.add("C"); + hs.add("A"); + + // Print the Set object elements + System.out.println("Set is " + hs); + + // Declaring a string + String check = "D"; + + // Check if the above string exists in + // the SortedSet or not + // using contains() method + System.out.println("Contains " + check + " " + + hs.contains(check)); + } +} +``` +**Removing the Values** +```java +// Java Program Demonstrating Working of Set by +// Removing Element/s from the Set + +// Importing all utility classes +import java.util.*; + +// Main class +class HashSetClass { + + // Main driver method + public static void main(String[] args) + { + // Declaring object of Set of type String + Set hs = new HashSet(); + + // Elements are added + // using add() method + + // Custom input elements + hs.add("A"); + hs.add("B"); + hs.add("C"); + hs.add("B"); + hs.add("D"); + hs.add("E"); + + // Printing initial Set elements + System.out.println("Initial HashSet " + hs); + + // Removing custom element + // using remove() method + hs.remove("B"); + + // Printing Set elements after removing an element + // and printing updated Set elements + System.out.println("After removing element " + hs); + } +} +``` +**Iterating through the Set** +```java +// Java Program to Demonstrate Working of Set by +// Iterating through the Elements + +// Importing utility classes +import java.util.*; + +// Main class +class HashSetClass { + + // Main driver method + public static void main(String[] args) + { + // Creating object of Set and declaring String type + Set hs = new HashSet(); + + // Adding elements to Set + // using add() method + + // Custom input elements + hs.add("A"); + hs.add("B"); + hs.add("C"); + hs.add("B"); + hs.add("D"); + hs.add("E"); + + // Iterating through the Set + // via for-each loop + for (String value : hs) + + // Printing all the values inside the object + System.out.print(value + ", "); + + System.out.println(); + } +} +``` + +### LinkedHashSet + +* LinkedHashSet class which is implemented in the collections framework is an ordered version of HashSet that maintains a doubly-linked List across all elements. +* When the iteration order is needed to be maintained this class is used. When iterating through a HashSet the order is unpredictable, while a LinkedHashSet lets us iterate through the elements in the order in which they were inserted. + +Let’s see how to create a set object using this class : +```java +// Java program to demonstrate the +// creation of Set object using +// the LinkedHashset class +import java.util.*; + +class LinkedHashSetClass { + + public static void main(String[] args) + { + Set lh = new LinkedHashSet(); + + // Adding elements into the LinkedHashSet + // using add() + lh.add("India"); + lh.add("Australia"); + lh.add("South Africa"); + + // Adding the duplicate + // element + lh.add("India"); + + // Displaying the LinkedHashSet + System.out.println(lh); + + // Removing items from LinkedHashSet + // using remove() + lh.remove("Australia"); + System.out.println("Set after removing " + + "Australia:" + lh); + + // Iterating over linked hash set items + System.out.println("Iterating over set:"); + Iterator i = lh.iterator(); + while (i.hasNext()) + System.out.println(i.next()); + } +} +``` +--- + + +### Sorted Set Interface + +* The SortedSet interface present in java.util package extends the Set interface present in the collection framework. It is an interface that implements the mathematical set. +* This interface contains the methods inherited from the Set interface and adds a feature that stores all the elements in this interface to be stored in a sorted manner. + + +* ### Declaration of Sorted Set Interface +```java +public interface SortedSet extends Set +``` +* TreeSet class is the implementation of SortedSet interface. + +### TreeSet + +* TreeSet class which is implemented in the collections framework and implementation of the SortedSet Interface and SortedSet extends Set Interface. +* It behaves like a simple set with the exception that it stores elements in a sorted format. TreeSet uses a tree data structure for storage. +* Objects are stored in sorted, ascending order. But we can iterate in descending order using the method TreeSet.descendingIterator(). + +Let’s see how to create a set object using this class. + +```java +// Java Program Demonstrating Creation of Set object +// Using the TreeSet class + +// Importing utility classes +import java.util.*; + +// Main class +class TreeSetExample { + + // Main driver method + public static void main(String[] args) + { + // Creating a Set object and declaring it of String + // type + // with reference to TreeSet + Set ts = new TreeSet(); + + // Adding elements into the TreeSet + // using add() + ts.add("India"); + ts.add("Australia"); + ts.add("South Africa"); + + // Adding the duplicate + // element + ts.add("India"); + + // Displaying the TreeSet + System.out.println(ts); + + // Removing items from TreeSet + // using remove() + ts.remove("Australia"); + System.out.println("Set after removing " + + "Australia:" + ts); + + // Iterating over Tree set items + System.out.println("Iterating over set:"); + Iterator i = ts.iterator(); + + while (i.hasNext()) + System.out.println(i.next()); + } +} +``` + +--- +## Map Interface + +* In Java, Map Interface is present in java.util package represents a mapping between a key and a value. Java Map interface is not a subtype of the Collection interface. Therefore it behaves a bit differently from the rest of the collection types. +* A map contains unique keys. +* Since Map is an interface, objects cannot be created of the type map. +* There are 2 Map Interface : + * Map + * SortedMap +* There are 3 class implementations of maps : + * HashMap + * LinkedHashMap + * TreeMap +* A Map cannot contain duplicate keys and each key can map to at most one value. Some implementations allow null key and null values like the HashMap and LinkedHashMap, but some do not like the TreeMap. +* The order of a map depends on the specific implementations. For example, TreeMap and LinkedHashMap have predictable orders, while HashMap does not. + +### HashMap +* HashMap provides the basic implementation of the Map interface of Java. It stores the data in (Key, Value) pairs. +* To access a value one must know its key. +* This class uses a technique called Hashing. Hashing is a technique of converting a large String to a small String that represents the same String. A shorter value helps in indexing and faster searches. + +Let’s see how to create a map object using this class. +```java +// Java Program to illustrate the Hashmap Class + +// Importing required classes +import java.util.*; + +// Main class +public class MapObjectUsingHashMap { + + // Main driver method + public static void main(String[] args) + { + + // Creating an empty HashMap + Map map = new HashMap<>(); + + // Inserting entries in the Map + // using put() method + map.put("vishal", 10); + map.put("sachin", 30); + map.put("vaibhav", 20); + + // Iterating over Map + for (Map.Entry e : map.entrySet()) + + // Printing key-value pairs + System.out.println(e.getKey() + " " + + e.getValue()); + } +} +``` +### LinkedHashMap +* LinkedHashMap is just like HashMap with the additional feature of maintaining an order of elements inserted into it. +* HashMap provided the advantage of quick insertion, search, and deletion but it never maintained the track and order of insertion which the LinkedHashMap provides where the elements can be accessed in their insertion order. + +Let’s see how to create a map object using this class. + +```java +// Java Program to Illustrate the LinkedHashmap Class + +// Importing required classes +import java.util.*; + +// Main class +public class MapObjectUsingHashMap { + + // Main driver method + public static void main(String[] args) + { + + // Creating an empty LinkedHashMap + Map map = new LinkedHashMap<>(); + + // Inserting pair entries in above Map + // using put() method + map.put("vishal", 10); + map.put("sachin", 30); + map.put("vaibhav", 20); + + // Iterating over Map + for (Map.Entry e : map.entrySet()) + + // Printing key-value pairs + System.out.println(e.getKey() + " " + + e.getValue()); + } +} +``` + + +### TreeMap +* The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used. This proves to be an efficient way of sorting and storing the key-value pairs. + +Let’s see how to create a map object using this class. + +```java +// Java Program to Illustrate TreeMap Class + +// Importing required classes +import java.util.*; + +// Main class +public class MapObjectUsingTreeMap { + + // Main driver method + public static void main(String[] args) + { + + // Creating an empty TreeMap + Map map = new TreeMap<>(); + + // Inserting custom elements in the Map + // using put() method + map.put("vishal", 10); + map.put("sachin", 30); + map.put("vaibhav", 20); + + // Iterating over Map using for each loop + for (Map.Entry e : map.entrySet()) + + // Printing key-value pairs + System.out.println(e.getKey() + " " + + e.getValue()); + } +} +``` + +--- + + +### Queue Interface +* The Queue interface is present in java.util package and extends the Collection interface is used to hold the elements about to be processed in FIFO(First In First Out) order. +* It is an ordered list of objects with its use limited to inserting elements at the end of the list and deleting elements from the start of the list, (i.e.), it follows the FIFO or the First-In-First-Out principle. + +* ### Declaration of Queue Interface +```java +public interface Queue extends Collection +``` + +**Creating Queue Objects** +* Since Queue is an interface, objects cannot be created of the type queue. We always need a class which extends this list in order to create an object. +* PriorityQueue and LinkedList are the classes that implements the Queue interface. + +Let's look at an example to explore how to create a class using this object. + +### LinkedList + +```java +import java.util.LinkedList; +import java.util.Queue; + +public class QueueExample { + public static void main(String[] args) { + Queue queue = new LinkedList<>(); + + // add elements to the queue + queue.add("apple"); + queue.add("banana"); + queue.add("cherry"); + + // print the queue + System.out.println("Queue: " + queue); + + // remove the element at the front of the queue + String front = queue.remove(); + System.out.println("Removed element: " + front); + + // print the updated queue + System.out.println("Queue after removal: " + queue); + + // add another element to the queue + queue.add("date"); + + // peek at the element at the front of the queue + String peeked = queue.peek(); + System.out.println("Peeked element: " + peeked); + + // print the updated queue + System.out.println("Queue after peek: " + queue); + } +} +``` + + +### PriorityQueue +Let’s see how to perform a few frequently used operations on the queue using the Priority Queue class. + +**1. Adding Elements:** +In order to add an element in a queue, we can use the add() method. The insertion order is not retained in the PriorityQueue. The elements are stored based on the priority order which is ascending by default. + +```java +// Java program to add elements +// to a Queue + +import java.util.*; + +public class PriorityQueueClass { + + public static void main(String args[]) + { + Queue pq = new PriorityQueue<>(); + + pq.add("Geeks"); + pq.add("For"); + pq.add("Geeks"); + + System.out.println(pq); + } +} +``` + +**2. Removing Elements:** +In order to remove an element from a queue, we can use the remove() method. If there are multiple such objects, then the first occurrence of the object is removed. Apart from that, poll() method is also used to remove the head and return it. +```java +// Java program to remove elements +// from a Queue + +import java.util.*; + +public class PriorityQueueClass { + + public static void main(String args[]) + { + Queue pq = new PriorityQueue<>(); + + pq.add("Geeks"); + pq.add("For"); + pq.add("Geeks"); + + System.out.println("Initial Queue " + pq); + + pq.remove("Geeks"); + + System.out.println("After Remove " + pq); + + System.out.println("Poll Method " + pq.poll()); + + System.out.println("Final Queue " + pq); + } +} +``` + +**3. Iterating the Queue:** +There are multiple ways to iterate through the Queue. The most famous way is converting the queue to the array and traversing using the for loop. However, the queue also has an inbuilt iterator which can be used to iterate through the queue. +```java +// Java program to iterate elements +// to a Queue + +import java.util.*; + +public class PriorityQueueClass { + + public static void main(String args[]) + { + Queue pq = new PriorityQueue<>(); + + pq.add("Geeks"); + pq.add("For"); + pq.add("Geeks"); + + Iterator iterator = pq.iterator(); + + while (iterator.hasNext()) { + System.out.print(iterator.next() + " "); + } + } +} +``` + + + +--- +## Deque Interface + +* Deque interface present in java.util package is a subtype of the queue interface. The Deque is related to the double-ended queue that supports the addition or removal of elements from either end of the data structure. It can either be used as a queue(first-in-first-out/FIFO) or as a stack(last-in-first-out/LIFO). Deque is the acronym for double-ended queue. +* The Deque (double-ended queue) interface in Java is a subinterface of the Queue interface and extends it to provide a double-ended queue, which is a queue that allows elements to be added and removed from both ends. +### Declaration of Dequeue Interface +```java +public interface Deque extends Queue +``` + +* Since Deque is an interface, objects cannot be created of the type deque. We always need a class that extends this list in order to create an object. +* ArrayDeque is the class that implements the Dequeue interface + +Example : +```java +// Java program to demonstrate the working +// of a Deque in Java + +import java.util.*; + +public class DequeExample { + public static void main(String[] args) + { + Deque deque + = new LinkedList(); + + // We can add elements to the queue + // in various ways + + // Add at the last + deque.add("Element 1 (Tail)"); + + // Add at the first + deque.addFirst("Element 2 (Head)"); + + // Add at the last + deque.addLast("Element 3 (Tail)"); + + // Add at the first + deque.push("Element 4 (Head)"); + + // Add at the last + deque.offer("Element 5 (Tail)"); + + // Add at the first + deque.offerFirst("Element 6 (Head)"); + + System.out.println(deque + "\n"); + + // We can remove the first element + // or the last element. + deque.removeFirst(); + deque.removeLast(); + System.out.println("Deque after removing " + + "first and last: " + + deque); + } +} +``` +--- +## Comparables + +* The Comparable interface in Java is used to define a natural ordering for a class. When a class implements the Comparable interface, it provides a way to compare instances of that class with each other. +* This natural ordering is primarily used for sorting elements in various collections like TreeSet or when using sorting algorithms like Collections.sort(). +* The Comparable interface contains a single method: +```java +int compareTo(T other) +``` +* Here, T represents the type of objects being compared. The compareTo method should return a negative integer, zero, or a positive integer based on whether the current object is less than, equal to, or greater than the object being compared (other). +* For example, consider a Person class that implements the Comparable interface to define a natural ordering based on age: + +```java +import java.util.*; + +class Person implements Comparable { + + String name; + int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + @Override + public int compareTo(Person other) { + return Integer.compare(this.age, other.age); + } + +} +``` + +* Now, instances of the Person class can be easily compared and sorted using their natural ordering (in this case, based on age) without explicitly providing a separate comparator. This is particularly useful when working with collections that require sorting or maintaining a natural order, such as TreeSet or Collections.sort(). + +--- +### Comparators + + +* In Java, a Comparator is an interface that provides a way to define custom ordering for objects in collections, such as lists or sets. It allows you to specify how elements should be compared and sorted based on specific criteria that you define. The Comparator interface is particularly useful when you want to sort objects in a way that differs from their natural order or when dealing with classes that don't implement the Comparable interface. +* Here's how the Comparator interface is typically used: + * **Creating a Comparator**: You can create a class that implements the Comparator interface. This class should provide the logic for comparing two objects based on the desired criteria. + * **Comparison Logic**: The Comparator interface requires you to implement the compare method, which takes two objects as parameters and returns a negative, zero, or positive integer depending on whether the first object is less than, equal to, or greater than the second object, respectively. This method allows you to define the custom ordering logic + * Using the Comparator: Once you have a Comparator implementation, you can use it in various ways: + * **Sorting collections**: You can pass the Comparator to sorting methods like Collections.sort() or Arrays.sort() to sort the elements in the desired order. + * **Creating sorted collections**: You can create collections (like TreeSet or PriorityQueue) that maintain elements in a sorted order using the provided Comparator. + * **Custom sorting**: You can use the Comparator to perform custom sorting tasks based on specific use cases. + +Here's a simple example of how you might use a Comparator to sort a list of Person objects based on +their ages: + +```java +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +class Person { + + String name; + int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } +} + +class AgeComparator implements Comparator { + + @Override + public int compare(Person person1, Person person2) { + return Integer.compare(person1.age, person2.age); + } +} + +public class ComparatorExample { + + public static void main(String[] args) { + + List people = new ArrayList<>(); + + people.add(new Person("Alice", 28)); + people.add(new Person("Bob", 22)); + people.add(new Person("Charlie", 25)); + + // Sort the list using the AgeComparator + Collections.sort(people, new AgeComparator()); + + // Iterate the List of people and check if it is now sorted on the basis of age or not. + for (Person person : people) { + System.out.println(person.name + " - " + person.age); + } + } +} +``` + +* In this example, the AgeComparator class implements the Comparator interface to compare Person objects based on their ages. +* The Collections.sort() method uses the AgeComparator to sort the list of Person objects. This allows you to customize the sorting behavior without modifying the Person class itself. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Linked List 1 Introduction.md b/Academy DSA Typed Notes/Advanced/DSA Linked List 1 Introduction.md new file mode 100644 index 0000000..4779efb --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Linked List 1 Introduction.md @@ -0,0 +1,600 @@ +# Linked List 1: Introduction + +--- +## Linked List + +### Issues with Array +We need continuous space in memory to store Array elements. Now, it may happen that we have required space in chunks but not continuous, then we will not be able to create an Array. + +### Linked List +* A linear data structure that can utilize all the free memory +* We need not have continuous space to store nodes of a Linked List. + +### Representation of Linked List + + + +* it has a data section where the data is present +* a next pointer which points to next element of the linked list + +### Structure of Linked List + +```java +class Node{ + int data; + Node next; + Node(int x){ + data = x; + next = null; + } +} +``` +**Example of Linked List** + + + +
+ + + +* the first node of the linked list is called head +* any linked list is represented by its first node + +--- +### Question +Where will the "next" pointer of the last node point to? + +**Choices** +- [ ] First Node +- [ ] Any Node +- [ ] Middle Node +- [x] Null + + +--- +### Question +From which node can we travel the entire linked list ? + +**Choices** +- [ ] Middle +- [x] First +- [ ] Last +- [ ] Any Node + + +--- +### Operation on Linked List + +### 1. Access kth element(k = 0; k is the first element) + +```java +Node temp = Head // temp is a compy +for i -> 1 to k { + temp = temp.next +} +return temp.data // never update head otherwise the first node is lost +``` +> Time complexity to access the kth element is O(K). Here we can see that linked list takes more time compared to array as it would take constant time to access the kth element. + +### 2. Check for value X (searching) +We can simply iterate and check if value X exists of not. +```java +temp = Head +while (temp != null){ + if(temp.data == X) + return true + temp = temp.next +} +return false +``` +> Here if the Linked List is empty i.e if `Head = NULL`, if we try to access head.next it will give null pointer expection error. + +Time Complexity for searching in Linked list is O(N). + +> In linked list we cannot perform binary search because we have to travel to the middle element. We cannot jump to the middle element unlike array. + +--- +### Question +What is the time complexity to search any node in the linked list? + +**Choices** +- [ ] O(1) +- [ ] O(log(N)) +- [x] O(N) +- [ ] O(N ^2) + + +--- +### Question +What is the time complexity to access the Kth element of the linked list? [index K is valid] + + +**Choices** +- [ ] O(1) +- [ ] O(log(N)) +- [ ] O(N) +- [x] O(K) + + +--- +### Problem 1 Insert a New Node with Data + +### Insert a New Node with Data + +Insert a new node with data **v** at index **p** in the linked list +>Though indexing doesn't exist is LL, but for our understanding, let's say Node 1 is at index 0, Node 2 at index 1, etc. + +**Testcase 1** +v = 60 and p = 3 + + + + + +**Solution to Testcase 1** +* Iterate to the node having index p-1 where p-1>=0 from start of linked list. Here p is 3 so we iterate till 2 +* On reaching index 2 we create a new node riz with data v i.e. 60 +* Set **riz.next = t.next** and set **t.next = riz** + + + +**Testcase 2** + + +**Solution to Testcase 2** +**We can do the dry run similar to testcase 1 here is the final result** + + +--- +### Question +Insert a new node with data **10** at index **2** in the Given linked list. + +Head -> 1 -> 6 -> 7 -> 9 -> Null + +Choose the correct LinkedList after insertion. + +**Choices** +- [ ] Head -> 1 -> 6 -> 7 -> 9 -> **10** -> Null +- [x] Head -> 1 -> 6 -> **10** -> 7 -> 9 -> Null +- [ ] Head -> 1 -> **10** -> 6 -> 7 -> 9 -> Null +- [ ] Head -> 10 -> 1 -> 6 -> 7 -> 9 -> Null + + +--- +### Insert a New Node with Data Approach + +#### Approach + +* Traverse till **(p - 1)th** node. Let's call it **t**. +* Create a new node **newNode**, with data **v**. +* Set **newNode.next** equals to **t.next**. +* Set **t.next** to reference of **newNode**. + + +#### Pseudocode 1 +```cpp +Function insertAtIndex(p, v, Node head) { + Node t = head + for (i = 1; i < p; i++) // iterating updating t, p-1 times + { + t = t.next + } + + // create a new node + Node newNode = Node(v) + + // Inserting the Node + newNode.next = t.next + t.next = newNode +} +``` +>Again there is an edge case to above solution can anyone figure it out ? + +#### Edge Case + +If p = 0 then where to insert the node ? +=> At head of the list. + + + +#### Pseudocode 2 + +```cpp +Function insertAtIndex(p, v, Node head) { + // create a new node + Node newNode = Node(v) + + Node t = head + + if (p == 0) { // edge case + newNode.next = head + head = newNode + } + + for (i = 1; i < p; i++) { // iterating updating t p-1 times + t = t.next + } + + // Inserting the Node + newNode.next = t.next + t.next = newNode +} +``` + + +### Time Complexity for Insertion +O(K) + + +--- + +### Deletion in Linked List + +*Delete the first occurrence of value X in the given linked list. If element is not present, leave as is.* + +**Example 1:** +```java +List: 1 -> 8 -> 4 -> -2 -> 12 +X = -2 + +Ans: +List: 1 -> 8 -> 4 -> 12 +-2 has been deleted from the list. +``` + +**Example 2:** +```java +List: 1 -> 8 -> 4 -> -2 -> 4 -> 12 +X = 4 + +Ans: +List: 1 -> 8 -> -2 -> 4 -> 12 +The first occurrence of 4 has been deleted from the list. +``` + +#### Cases: +1. **Empty list i.e., head = null** + +```java +List: null +X = 4 + +Ans: +List: null +``` +2. **head.data = X i.e., delete head** + +```java +List: 4 +X = 4 + +Ans: +List: null +``` + +3. **X is somewhere in between the list, find and delete node with value X** +```java +List: 1 -> 8 -> 4 -> -2 -> 4 -> 12 +X = 4 + +Ans: +List: 1 -> 8 -> -2 -> 4 -> 12 (removed first occurrence) +``` +4. **X is not in the list, simply return** +```java +List: 1 -> 8 -> -2 -> 7 -> 12 +X = 4 + +Ans: +List: 1 -> 8 -> -2 -> 7 -> 12 +``` + +--- +### Question +Delete the first occurrence of value **X** in the given linked list. If element is not present, leave as is. + +Linked List : ```5 -> 4 -> 7 -> 1 -> NULL``` +X (to Delete) : 1 + +**Choices** +- [ ] 5 -> 4 -> 7 -> 1 -> NULL +- [x] 5 -> 4 -> 7 -> NULL +- [ ] 4 -> 7 -> 1 -> NULL +- [ ] 5 -> 7 -> NULL + + + +**Explanation:** + +The Value 1 is not present in the Linked List. So leave as it is. + +Thus, the final Linked List is 5 -> 4 -> 7 -> -1 -> NULL + + +--- +### Deletion in Linked List Approach and Pseudocode +#### Approach + +- Check if the list is empty; if so, return it as is. +- If the target value X is at the head, update the head to the next node. +- Otherwise, iterate through the list while looking for X. +- When X is found, skip the node containing it by updating the next reference of the previous node. +- Return the modified head (which may or may not have changed during the operation). + +#### Pseudocode + +```java +if (head == null) return head +if (head.data == X) { + tmp = head + free(tmp) //automatically done in java, whereas have to do manually for c++ and other languages. + head = Head.next + return head +} +temp = head +while (temp.next != null) { + if (temp.next.data == X) { + tmp = temp.next + temp.next = temp.next.next + free(tmp) + return head + } + temp = temp.next +} +return head +``` +#### Time complexity for Deletion +**O(N)** + +> It can be seen that every operation in linked list takes linear time complexity unlike arrays. + +--- +### Problem 3 Reverse the linked list + + +**Note:** We can't use extra space. Manipulate the pointers only. + +**Example** + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach: +- Check for Empty List: + - If head is null, return it as is. +- Handle Single Node List: + - If head.next is null, return head. (This line is optional and can be omitted without affecting the core functionality.) +- Reverse the Linked List: + - Initialize cur as head, pre as null, and a temporary variable nxt. + - While cur is not null, do the following: + - Store the next node in nxt. + - Reverse the next pointer of cur to point to pre. + - Update pre to cur. + - Move cur to the next node (nxt). +- Update head: + - After the loop, set head to pre, making the reversed list the new head. + +#### Dry Run +**Initialize the pointers** + +prev = null +curr = 2 -> 5 -> 8 -> 7 -> 3 -> null +nxt = null + +#### Iteration 1: +**Store the next node in nxt** +```java +nxt = curr.next; nxt = 5 -> 8 -> 7 -> 3 -> null +``` +**Reverse the next pointer of the current node** +```java +curr.next = prev +``` +**Update the previous and current pointers** +```java +prev = curr +curr = nxt +prev = 2 -> null +curr = 5 -> 8 -> 7 -> 3 -> null +``` +#### Iteration 2: +**Store the next node in nxt** +```java +nxt = curr.next; nxt = 8 -> 7 -> 3 -> null +``` +**Reverse the next pointer of the current node** +```java +curr.next = prev +``` +**Update the previous and current pointers** +```java +prev = curr +curr = nxt +prev = 5 -> 2 -> null +curr = 8 -> 7 -> 3 -> null +``` + +#### Iteration 3: +**Store the next node in nxt** +```java +nxt = curr.next; nxt = 7 -> 3 -> null +``` +**Reverse the next pointer of the current node** +```java +curr.next = prev +``` +**Update the previous and current pointers** +```javascript +prev = curr +curr = nxt +prev = 8 -> 5 -> 2 -> null +curr = 7 -> 3 -> null +``` + +#### Iteration 4: +**Store the next node in nxt** +```java +nxt = curr.next; nxt = 3->null +``` +**Reverse the next pointer of the current node** +```java +curr.next = prev +``` +**Update the previous and current pointers** +```java +prev = curr +curr = nxt +prev = 7 -> 8 -> 5 -> 2 -> null +curr = 3 -> null +``` +**Iteration 5**: + +**Store the next node in nxt** +```java +nxt = curr.next; nxt = null +``` +**Reverse the next pointer of the current node** +```java +curr.next = prev +``` +**Update the previous and current pointers** +```java +prev = curr +curr = nxt +prev = 3 -> 7 -> 8 -> 5 -> 2 -> null +curr = null +``` + +The **loop terminates** because **curr is now null** + +Final state of the linked list: +```java +prev = 3 -> 7 -> 8 -> 5 -> 2 -> null +curr = null +The head of the linked list is now prev, which is the reversed linked list: + +3 7 8 5 2 +``` + +--- +### Question +Reverse the given Linked List. + +Linked List : 5 -> 6 -> 7 -> 8 -> 9 + +**Choices** +- [ ] 5 -> 6 -> 7 -> 8 -> 9 +- [x] 5 <- 6 <- 7 <- 8 <- 9 +- [ ] 9 -> 6 -> 7 -> 8 -> 5 +- [ ] 5 <- 6 -> 7 <- 8 <- 9 + + + + +--- +### Reverse the LinkedList Psuedo code and Time Complexity +#### Psuedocode +```java +if (head == null) + return head; + +if (head.next == null) + return head; + +cur = head; +pre = null; + +while (cur != null) { + next = cur.next; + cur.next = pre; + pre = cur; + cur = next; +} + +head = pre; +``` +#### TC & SC +**Time complexity -** O(N) +**Space complexity -** O(1) + +-- +### Problem 2 Check Palindrome + +Given a Linked List, check if it is a palindrome. + +**Example:** +maam, racecar, never, 121, 12321 + + + + +--- +### Question +Check the Given linked list is Palindrome or not. + +Linked List : ```Head -> 1 -> Null``` + +**Choices** +- [x] YES +- [ ] NO + + +**Explanation:** + +Yes, The Given Linked List is an Palindrome, Because it reads the same in reverse order as well. + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +### Check Palindrome Solution + + +**Solution 1 :** +Create a copy of linked list. Reverse it and Compare + +**Complexity** +**Time Complexity -** O(N) +**Space Complexity -** O(N). + + +**Solution 2 :** +1. Find middle element of linked list +2. Reverse second half of linked list +3. Compare first half and compare second half + +**Step wise solution:** + +1. **Find length of linked list** +```java +n = 0 +temp = Head +while(temp != null){ + n++ + temp = temp.next +} +``` +2. **Go to the middle element** +// If n = 10(even), we'll reverse from 6th node. +// If n = 9(odd), then also we'll reverse from 6th node.(**5th node will be middle one that need not be compared with any node**) + +So, regardless of even/odd, we can skip (n + 1) / 2 nodes. +```java +temp Head +(for i --> 1 to (n + 1) / 2){ + temp =temp.next +} +//temp middle +``` +3. Now reverse the linked list from $((n+1)/2 + 1)th$ node. +4. Compare both the linked list + +#### T.C & S.C + +Total time complexity for checking palindrome is O(N) and space complexity is O(N). + diff --git a/Academy DSA Typed Notes/Advanced/DSA Linked List 2 Sorting and Detecting Loop.md b/Academy DSA Typed Notes/Advanced/DSA Linked List 2 Sorting and Detecting Loop.md new file mode 100644 index 0000000..13691b3 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Linked List 2 Sorting and Detecting Loop.md @@ -0,0 +1,503 @@ +# Linked List 2: Sorting and Detecting Loop + +--- +### Question +What is the time complexity needed to delete a node from a linked list? + +**Choices** +- [ ] O(1) +- [ ] O(log(N)) +- [x] O(N) +- [ ] O(N^2) + +#### Explanation + +To delete a node from the linked list we need to traverse till that node. In the worst case, the time-complexity would be O(N). + +--- + +### Question +What is the time complexity needed to insert a node as the head of a linked list? + + +**Choices** +- [x] O(1) +- [ ] O(log(N)) +- [ ] O(N) +- [ ] O(N$^2$) + + +**Explanation** + +No traversal is needed to reach the head node. Therefore the time complexity needed is constant i.e. O(1). + +--- +### Question + +What is the time complexity needed to delete the last node from a linked list? + +**Choices** +- [ ] O(1) +- [ ] O(log(N)) +- [x] O(N) +- [ ] O(N$^2$) + +**Explanation:** + +To delete the last node from the linked list we need to traverse till that node. In that case, the time-complexity would be O(N). + +--- +### Question + +Can we do Binary Search in a sorted Linked List? + +**Choices** +- [ ] Yes +- [x] No + + +**Explanation:** + +Binary search relies on random access to elements, which is not possible in a linked list. + + + +--- +### Problem 1 Find the middle element. + +Given a Linked List, Find the middle element. + +**Examples** + +Following 0 based indexing: The middle node is the node having the index (n / 2), where n is the number of nodes. + +```cpp +Input: [1 -> 2 -> 3 -> 4 -> 5] +Output: [3] + +Here 3 is the middle element + +``` + +```cpp +Input: [1 -> 2 -> 3 -> 4] +Output: [2] + +There are two middle elements here: 2 and 3 respectively. + +``` + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +### Find the middle element Solution +#### Solution + +* First, We will find the length of the linked-list. +* Now we will traverse half the length to find the middle node + + + +#### Pseudocode +```cpp +function findMiddle(head) + if head is null + return null + + count = 0 + current = head + while current is not null + count = count + 1 + current = current.next + + middleIndex = count / 2 + current = head + for i = 0 to middleIndex - 1 + current = current.next + + return current +} +``` + +#### Complexity +**Time Complexity:** O(n * 2) = O(n) +**Space Complexity:** O(1) + +#### Optimized Solution +We can optimize the solution using the **Two Pointers** technique. +* Take two pointers initially pointing at the head of the Linked List and name them slowPointer and fastPointer respectively. +* The fastPointer will travel two nodes at a time, whereas the slowPointer will traverse a single node at a time +* When the fastPointer reaches the end node, the slowPointer must necessarily be pointing at the middle node + + + +#### Pseudocode +```java +function findMiddleTwoPointers(head) + if head is null + return null + + slowPointer = head + fastPointer = head + + while fastPointer is not null and fastPointer.next is not null + slowPointer = slowPointer.next + fastPointer = fastPointer.next.next + + return slowPointer +``` + +#### Complexity +**Time Complexity:** O(n / 2) = O(n) +**Space Complexity:** O(1) + + + +--- +### Problem 2 Merge two sorted Linked Lists + +Given two sorted Linked Lists, Merge them into a single sorted linked list. + +**Example 1 :** + +```cpp +Input: [1 -> 2 -> 8 -> 10], [3 -> 5 -> 9 -> 11] + +Output: [1 -> 2 -> 3 -> 8 -> 9 -> 10 -> 11] +``` + +**Example 2 :** + +```cpp +Input: [1 -> 7 -> 8 -> 9], [2 -> 5 -> 10 -> 11] + +Output: [1 -> 2 -> 5 -> 7 -> 8 -> 9 -> 11] +``` + +--- +### Question +Given two sorted Linked Lists, Merge them into a single sorted linked list. + +`Input: [2 -> 10 -> 11] [1 -> 5 -> 12 -> 15]` + +**Choices** +- [x] [1 -> 2 -> 5 -> 10 -> 11 -> 12 -> 15] +- [ ] [2 -> 10 -> 11 -> 1 -> 5 -> 12 -> 15] +- [ ] [1 -> 5 -> 12 -> 15 -> 2 -> 10 -> 11] +- [ ] [1 -> 2 -> 10 -> 5 -> 12 -> 11 -> 15] + + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +### Merge two sorted Linked Lists Solution +#### Solution + * Base Cases Handling: First of all, we need to take care of the Base cases: if either list is empty,we return the other list + * Determine Merged List's Head: The algorithm compares the first nodes of the two lists. The smaller node becomes the head of the merged list. + * Merge the Remaining Nodes:Merge the remaining nodes in such a way that whichever linked lists node is the smallest, we add it to the current list + * We continue doing this till the end of one of the linked lists is reached + * Finally we attach any remaining nodes from list1 or list2 +* Returning the Result: We return the linked list + +#### Pseudocode + +```cpp +function mergeSortedLists(list1, list2) + if list1 is null + return list2 + if list2 is null + return list1 + + mergedList = null + + if list1.data <= list2.data + mergedList = list1 + list1 = list1.next + else + mergedList = list2 + list2 = list2.next + + current = mergedList + + while list1 is not null and list2 is not null + if list1.data <= list2.data + current.next = list1 + list1 = list1.next + else + current.next = list2 + list2 = list2.next + current = current.next + + if list1 is not null + current.next = list1 + if list2 is not null + current.next = list2 + + return mergedList + +} +``` + +#### Complexity +**Time Complexity:** O(n + m) +**Space Complexity:** O(1) + +--- +### Problem 3 Sort a Linked List + +A Linked List is given, Sort the Linked list using merge sort. + +**Example** +```cpp +Input: [1 -> 2 -> 5 -> 4 -> 3] +Output: [1 -> 2 -> 3 -> 4 -> 5] + +``` + +```cpp +Input: [1 -> 4 -> 3 -> 2] +Output: [1 -> 2 -> 3 -> 4] + +``` + + +#### Solution + +**Base Case:**
The function starts by checking if the head of the linked list is null or if it has only one element (i.e., head.next is null). These are the base cases for the recursion. If either of these conditions is met, it means that the list is already sorted (either empty or has only one element), so the function simply returns the head itself. + +**Find the Middle Node:**
If the base case is not met, the function proceeds to sort the list. First, it calls the findMiddle function to find the middle node of the current list. This step is essential for dividing the list into two halves for sorting. + +**Split the List:**
After finding the middle node (middle), the function creates a new pointer nextToMiddle to store the next node after the middle node. Then, it severs the connection between the middle node and the next node by setting middle.next to null. This effectively splits the list into two separate sublists: left, which starts from head and ends at middle, and right, which starts from nextToMiddle. + +**Recursively Sort Both Halves:**
The function now recursively calls itself on both left and right sublists. This recursive step continues until each sublist reaches the base case (empty or one element). Each recursive call sorts its respective sublist. + +**Merge the Sorted Halves:**
Once the recursive calls return and both left and right sublists are sorted, the function uses the mergeSortedLists function to merge these two sorted sublists into a single sorted list. This merging process combines the elements from left and right in ascending order. + +**Return the Sorted List:**
Finally, the function returns the sortedList, which is the fully sorted linked list obtained by merging the sorted left and right sublists + +#### Pseudocode +```cpp +// Function to merge two sorted linked lists + +function mergeSortedLists(list1, list2) + if list1 is null + return list2 + if list2 is null + return list1 + + mergedList = null + + if list1.data <= list2.data + mergedList = list1 + mergedList.next = mergeSortedLists(list1.next, list2) + else + mergedList = list2 + mergedList.next = mergeSortedLists(list1, list2.next) + + return mergedList + +function findMiddle(head) + if head is null or head.next is null + return head + + slow = head + fast = head.next + + while fast is not null and fast.next is not null + slow = slow.next + fast = fast.next.next + + return slow + +function mergeSort(head) + if head is null or head.next is null + return head + + // Find the middle node + middle = findMiddle(head) + nextToMiddle = middle.next + middle.next = null + + // Recursively sort both halves + left = mergeSort(head) + right = mergeSort(nextToMiddle) + + // Merge the sorted halves + sortedList = mergeSortedLists(left, right) + + return sortedList +``` + +#### Complexity +**Time Complexity:** O(Nlog(N)) +**Space Complexity:** O(log(N)) + +--- +### Problem 4 Detect Cycle in a Linked List. + +Given a Linked List, Find whether it contains a cycle. + +**Example 1** + +**Input:** + + + +**Output:** +```plaintext +Yes +``` + +**Example 2** + +**Input:** +Input: [1 -> 4 -> 3 -> 2 -> 11 -> 45 -> 99] + + +**Output:** +```plaintext +No +``` + +--- +### Detect Cycle in a Linked List Solution +#### Solution + + +* **Initialization:**
Start with two pointers, slow and fast, both pointing to the head of the linked list. + +* **Traversal:**
In each iteration, the slow pointer advances by one step, while the fast pointer advances by two steps. This mimics the tortoise and hare analogy. If there is a cycle, these two pointers will eventually meet at some point within the cycle. + +* **Cycle Detection:**
While traversing, if the slow pointer becomes equal to the fast pointer, this indicates that the linked list contains a cycle. This is because the fast pointer "catches up" to the slow pointer within the cycle. + +* **No Cycle Check:**
If the fast pointer reaches the end of the linked list and becomes null or if the fast pointer's next becomes nullp, this means there is no cycle in the linked list. + +* **Cycle Detected:**
If the slow and fast pointers meet, it implies that the linked list contains a cycle. The function returns true. + + +#### Pseudo Code +```cpp +function hasCycle(head) + if head is null or head.next is null + return false // No cycle in an empty or single-node list + + slow = head + fast = head.next + + while fast is not null and fast.next is not null + if slow is the same as fast + return true // Cycle detected + slow = slow.next + fast = fast.next.next + + return false // No cycle detected + + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + + +--- +### Problem 5 Find the starting point + +Given a Linked List which contains a cycle , Find the start point of the cycle. + +**Example** + +**Input:** + + + + +**Output:** +```plaintext +5 +``` + + +--- +### Find the starting point Solution + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Solution +* **Initialization:**
Similar to cycle detection, start with two pointers, slow and fast, both pointing to the head of the linked list. + +* **Cycle Detection:**
In each iteration, move the slow pointer by one step and the fast pointer by two steps. If a cycle exists, they will eventually meet within the cycle. + +* **Meeting Point:**
If a cycle is detected (slow meets fast), set a flag hasCycle to true. + +* **Start Point Identification:**
Reset the slow pointer to the head of the list while keeping the fast pointer at the meeting point. Advance both pointers by one step in each iteration. They will eventually meet at the start point of the cycle. + +* **Returning the Result:**
Once the slow and fast pointers meet again, it implies that the linked list has a cycle, and the meeting point is the start of the cycle. Return this pointer. + + + +Assume that the length from the head to the first node of cycle is x and the distance from the first node of cycle to the meeting point is y. Also the length from the meeting point to the first node is z. + +Now, speed of the fast pointer is twice the slow pointer + +```cpp +2(x + y) = x + y + z + y + +x = z + +``` + + + + +* **No Cycle Check:** If the fast pointer reaches the end of the linked list (i.e., becomes nullptr) or if the fast pointer's next becomes nullptr, there is no cycle. In such cases, return nullptr. + +This approach ensures that you can find the start point of the cycle using the Floyd's Tortoise and Hare algorithm with a slightly modified process. + + +#### Pseudo Code +```cpp +function detectCycleStart(head) + if head is null or head.next is null + return null // No cycle in an empty or single-node list + + slow = head + fast = head + hasCycle = false + + while fast is not null and fast.next is not null + slow = slow.next + fast = fast.next.next + + if slow is the same as fast + hasCycle = true + break + + if not hasCycle + return null // No cycle detected + + slow = head + while slow is not the same as fast + slow = slow.next + fast = fast.next + + return slow // Return the start point of the cycle + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + diff --git a/Academy DSA Typed Notes/Advanced/DSA Linked List 3 Problems & Doubly Linked List.md b/Academy DSA Typed Notes/Advanced/DSA Linked List 3 Problems & Doubly Linked List.md new file mode 100644 index 0000000..15b7700 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Linked List 3 Problems & Doubly Linked List.md @@ -0,0 +1,340 @@ +# Linked List 3: Problems & Doubly Linked List + +--- +## What is doubly linked list + +A doubly linked list is a type of data structure used in computer science and programming to store and organize a collection of elements, such as nodes. It is similar to a singly linked list but with an additional feature: each node in a doubly linked list contains pointers or references to both the next and the previous nodes in the list. + +**Example** + + + +### Correlation with Singly Linked List + +The main difference between singly linked lists and doubly linked lists lies in the bidirectional traversal capability of the latter, which comes at the cost of increased memory usage. The choice between them depends on the specific requirements of the problem we're solving and the operations we need to perform on the list + +> **Note-1**: Sometimes the `previous` pointer is called the `left` pointer and the `next` pointer is called the `right` pointer. +> **Note-2**: The `previous` pointer of the first node always points to `null` and the `next` pointer of the last node also points to `null` in the doubly linked list. + +--- +### Question +`prev` Pointer of Head of Doubly LinkedLIst points to: + +**Choices** +- [ ] Next to Head Node +- [x] Null pointer +- [ ] Tail +- [ ] Depends + + +--- +### Problem 1 Insert node in a doubly linked list + +A doubly linked list is given. A node is to be inserted with data ``X`` at position ``K``. The range of ``K`` is between 0 and ``N`` where ``N`` is the length of the doubly Linked list. + +**Example** + + + +--- + +### Question +In a doubly linked list, the number of pointers affected for an insertion operation between two nodes will be? + +**Choices** +- [ ] 1 +- [ ] 2 +- [ ] 3 +- [x] 4 +- [ ] Depends + + +For insertions in the middle of the list **four** pointer assignments take place. + +--- +### Insert node in a doubly linked list Solution +#### Solution +A naive approach to insert a node with data `X` at position `K` in a doubly linked list of length `N` would involve traversing the list from the beginning until position `K` is reached, and then updating the pointers of the adjacent nodes to include the new node. This approach takes `O(K)` time complexity in the worst case. + +#### Our Approach +Let us now move on to the below approach: + +Suppose given data are `X = 8` and `K = 3` and the provided linked list contains the nodes 1, 2, 3, 4, 5. Now, describe the overall approach in a step-wise manner. + +1. The very first thing that can be done is to create a node with data `X` whose previous and next pointers are pointing toward `null` currently. +2. Next, we need to check if our linked list is empty or not. In the case of an empty linked list head pointer points towards `null`. So, if the head pointer is pointing towards `null`, we can simply return a new node with data `X`. +3. The next thing that we need to take care of is if the value of `K` is zero. In this case, we need to add a new node with data `X` pointed by the head pointer. we also need to update the head pointer and the next pointer of the newly created node. +4. Now that we have covered the two base cases, we can simply add the node by making `K - 1` jumps from the head pointer. For this, we can create a temporary node that is currently pointing toward the head, and we will traverse the `K - 1` nodes to reach the position where we want to add the new node. +5. The last and most important thing that we need to do here is to update the next and previous pointers of `K - 1` and `K + 1` nodes. + +Let us now see the pseudo code of our approach. + +#### Pseudocode +```cpp +xn = new Node(x) // xn.next = xn.pre = null + +// Empty List +if (head == null) + return xn + +// Update head +if (k == 0) { + xn.next = head + head.pre = xn + head = xn + return head +} + +temp = head +for i = 1 to(k - 1) +temp = temp.next + +xn.next = temp.next +xn.pre = temp +if (temp.next != null) + temp.next.pre = xn +temp.next = xn +return head +``` + +>**Note**: we should also check if our current position of insertion is the last node or not. In the case of the last node, the next pointer is pointing toward the `null`. So, we have to make it point to the current node. + +#### Time and Space Complexity +- **Time Complexity**: **O(N)**, since we traverse the linked list only once. +- **Space Complexity**: **O(1)** as we are not using any extra list. + +--- +### Problem 2 Delete the first occurrence of a node from the doubly linked list + +We have been given a doubly linked list of length `N`, we have to delete the first occurrence of data `X` from the given doubly linked list. If element `X` is not present, don't do anything. + +**Example** + + + + +--- +### Delete the first occurrence Solution + +#### Solution +A naive approach to solving this problem would be to start from the beginning of the doubly linked list and traverse it node by node. If the data of a node matches the given element, X, then remove that node by updating the next and previous pointers of the adjacent nodes to bypass the node to be deleted. + +#### Our Approach +Suppose we have a DLL having nodes 9, 7, 3, 7, and 3, and we have to delete node 7. Let's break it into smaller steps: +1. The simple thing that we need to do in this problem is to grab the previous node and the next node of node `X`. +2. Then make the next pointer of the previous node point to the next node and make the previous pointer of the next node point to the previous node. +3. Now, move on to corner cases. The first corner case is when the head pointer is pointing to `null`. In this case, we simply need to return null as we cannot delete anything. +4. Now let's move on to the normal case and search for our next node. For searching we just need to create a temporary nod that is pointing to the head. +5. Now, we will traverse the entire list using temporary nodes and check if the current node's value is the same as the `X`'s value. +6. If the value is found, we just need to stop searching and delete the node. + +After traversal, we can have three situations: +1. If the temp pointer is pointing to null, this means that we have not found our node. So, we can simply return the head pointer. +2. If the previous pointer of the temporary node is pointing to null, then this means that our desired node is the first node. So, we need to delete the head pointer and simply return null. This will work the same if the next pointer of temp is null. +3. If both the above corner cases are not encountered, then we can simply delete the current node that is pointed by temp. + +Let us now see the pseudo code of our approach. + +#### Pseudocode +```cpp +temp = head + +// Searching +while (temp != null) { + if (temp.data == X) + break + temp = temp.next +} + +// No update +if (temp == null) { + return head +} + +// Single node +if (temp.pre == null and temp.next == null) { + return null +} else if (temp.pre == null) // delete head +{ + temp.next.pre = null + head = temp.next +} else if (temp.next == null) { + temp.pre.next = null +} else { + temp.pre.next = temp.next + temp.next.pre = temp.pre +} + +return head +``` + + +#### Time and Space Complexity +- **Time Complexity**: **O(N)**, since we traverse the linked list only once. +- **Space Complexity**: **O(1)** as we are not using any extra list. + +--- +### Problem 3 LRU + +We have been given a running stream of integers and the fixed memory size of `M`, we have to maintain the most recent `M` elements. In case the current memory is full, we have to delete the least recent element and insert the current data into the memory (as the most recent item). + +**Example** +This question is closely related to the concept of an LRU (Least Recently Used) cache memory. An LRU cache is a data structure that maintains a fixed-size memory and stores the most recently accessed items. When the cache is full and a new item needs to be inserted, the least recently used item is evicted to make space for the new item. + + + +--- +### Question +What is the behavior of an LRU cache memory when a new item is inserted and the cache is already full? + +**Choices** + +- [x] The new item is added to the cache, and the least recently used item is removed from the cache. +- [ ] The new item is not added to the cache, and the least recently used item is not removed from the cache. +- [ ] The new item is added to the cache, and the least recently used item is updated to be the most recently used item. +- [ ] The new item is not added to the cache, and the most recently used item is removed from the cache. + + + +In an LRU cache, the least recently used item is always the one that is removed when the cache is full and a new item needs to be inserted. This ensures that the most recently accessed items are always prioritized and kept in the cache. + +--- +### LRU Solution + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Solution +Suppose we have several data to be inserted and the memory size is `M = 5`. So, we will take data one by one and insert it into the memory. As soon as the memory gets full, we have to delete the oldest data. In case a number comes and the same number is present in the memory pool, it will not be deleted but it will be considered as the most recent element. + +A decision tree or flow chart can also be created for the problem. + + + +There can be two cases when a new number is to be inserted. +1. If the current number is not present in the memory pool. In this case, we can simply delete the oldest number (i.e. deleting the head node). +2. If the current number is present in the memory pool. In this case, we have to maintain the number `X`, as well as its position. So we can use a data structure called HashMap. + +Let us now see the pseudo code of our approach. + +#### Our Approach +So, the conclusion is that we have to use a Doubly Linked List or a hashmap for the solution to this problem. Let now move on to the Coding / Solution part: +1. Create a HashMap. Storing the value `X`, and the node of `X`. +2. Check if the HashMap contains `X` and the size of memory is not full, then we can simply put a new number at the last position. In this case, we also need to tackle the corner cases of the problem - Deletion of a new node from the doubly linked list. +3. The last case is when the number `X` is not present in the memory pool. Here, if the memory is full, we have to delete the oldest number i.e. the head node of the DLL( that we covered in the previous question). If the memory is not full we need to insert a new node into DLL at last. + +#### Important Concept +There is an important concept in the Doubly linked list that is shallow copying and deep copying. + +In a doubly linked list, the concept related to shallow copying and deep copying is about how references (pointers) to nodes are managed during copying: "Shallow copying" involves copying the structure of the list, including the references, while "deep copying" involves creating new nodes and copying their content to have an independent copy of the original list. + + + +#### Pseudocode +```cpp +// Take a hashmap (hm) +HashMap < x, node of x > hm; + +if (h.containsKey(X)) { + // Delete x from its position + xn = hm.get(x) + head = deleteNode(xn, head) + // insert as as node + tail.next = xn + xn.pre = tail + tail = xn +} else // Not present +{ + // full memory + if (hm.size() == M) { + hm.remove(head.data) + deleteNode(head) + } + xn = new Node(x) + hm.put(x, xn) + if (hm.size() > 1) { + // Insert as last node + tail.next = xn + xn.pre = tail + tail = xn + } else { + head = tail = xn + } +} +``` + +#### Time and Space Complexity +- **Time Complexity**: **O(N)**, since we traverse the linked list only once. +- **Space Complexity**: **O(1)** since we are not using any additional list. + +--- +### Problem 4 Deep copy of a doubly linked list + +we have to create a deep copy of the Doubly Linked list with random pointers. Here there is no certain next and previous pointer, a node can point to some other node. + +**Example** + + + + +--- +### Deep Copy Solution + +#### Solution +A naive approach to creating a deep copy of a doubly linked list with random pointers could involve iteratively traversing the original list, creating new nodes with the same data and random pointers, and then using additional passes to update the random pointers to point to the corresponding new nodes in the copied list. + +#### Our Approach +1. In a node, we have two pointers. The first one is the next pointer and the second one is a random pointer. +2. Our goal is to populate the Doubly Linked list using the next and random pointer. For this, we will be using the concept of deep copying in this. +3. Now, since we don't have the previous and next pointer as of the Doubly Linked list, we can use a HashMap to map the original nodes. +4. So, we will be creating the HashMap containing two things one is an old node and another is a new node but there is a small problem in this approach, we are using extra space here. As we only want the original mapping, we can solve this with constant space. + +A systematic approach can be: +1. we will create a copy of each node calling it ``node_1`` and making it pointed by the first node. +2. After this, we will make it point to the second node. So we are pushing a node between two nodes. + >**Note**: Here, we can teach that this problem can be summarized as pushing a copy of a node between two nodes and then changing the random pointer. +3. Now, the problem becomes sorted as we only must copy a node and insert it in the middle of its previous and next node. +4. Finally, we will be shuffling the random pointer. For this, we will be using an extra node ``X``, and ``X`` will be traversing until the last node of the list. + +#### Pseudocode +```cpp +// Populate random pointers +x = head +while (x != null) { + y = x.next + y.random = x.random.next + x = x.next.next +} + +// Separate two +h = head.next +x = head +while (x != null) { + y = x.next + x.next = x.next.next + if (y.next != null) { + y.next = y.next.next + } + x = x.next +} + +return h +``` + +#### Time and Space Complexity +- **Time Complexity**: **O(N)**, as we are creating a deep copy of the doubly linked list with random pointers. +- **Space Complexity**:**O(N)**. In the case of deleting the first node, the time complexity remains **O(1)** as long as the deletion operation itself is **O(1)**. + + +--- + + +### Question +What is the time complexity of creating a deep copy of a Doubly Linked List consists of N nodes with random pointers using extra space? + +**Choices** +- [x] O(N) +- [ ] O(N * N) +- [ ] O(1) +- [ ] O(log(N)) \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Maths 1 Modular Arithmetic & GCD.md b/Academy DSA Typed Notes/Advanced/DSA Maths 1 Modular Arithmetic & GCD.md new file mode 100644 index 0000000..abaea6e --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Maths 1 Modular Arithmetic & GCD.md @@ -0,0 +1,438 @@ +# Maths 1: Modular Arithmetic & GCD + +--- +## Modular Arithmetic Introduction + +A % B = Remainder when A is divided by B + +Range of A % B will be within **[0, B - 1]** + +### Why do we need Modular Arithmetic(%) ? + +The most useful need of `%` is to limit the range of data. We don't have unlimited range in **Integer** OR **Long**, hence after a certain limit, we cannot store data. In such cases, we can apply mod to limit the range. + +### Rules for applying mod on Arithmetic Operations + +**1.** `(a + b) % m = (a % m + b % m) % m` + + +**Example:** + + +--- +**2.** `(a * b) % m = (a % m * b % m) % m` + + +**3.** `(a + m) % m = (a % m + m % m) % m = (a % m) % m = a % m` + +--- +**4.** `(a - b) % m = (a % m - b % m + m) % m` + +This extra **m** term is added to ensure that the result remains within the range of **0 to m-1** even if the intermediate result of **(a % m - b % m) is negative**. This guarantees that the final remainder is a non-negative value. + +Example: +Let's take **a = 7**, **b = 10**, and **m = 5**. + +$(a - b)~ \%~ m ~=~ (7 - 10) ~\%~ 5 ~=~ -3 ~\%~ 5 = -3$ (which is not in the range 0 to 4) + +Now we can simly do +(-3 + 5) % 5 = 2 (now value is in the range 0 to 4) + +--- +**5.** `(a ^ b) % m = ( (a % m) ^ b ) % m` +(a raise to power b) + +--- +### Question + +Evaluate : + +$(37^{103} - 1) \% 12$ + +**Choices** + +- [ ] 1 +- [x] 0 +- [ ] No Idea +- [ ] 10 + +**Explanation**: + + +$(37^{103}-1)\%12$ + +$=>~ ((37^{103}~\%12)-(1\%12)+12)\%12$ + +$=>~ (((37\%12){103}~\%12)-1+12)~\%12$ + +$=>~ (1-1+12)\%12 = 12\%12 =0$ + +--- +### Question + +What is the result of the following modular arithmetic operation? +(25+13)%7 + +**Choices** + +- [ ] 1 +- [ ] 2 +- [x] 6 +- [ ] 4 + +**Explanation** + +(25+13)%7=38%7=3⋅7+3=3 +Therefore, the correct choice is 6. + +--- +### Question 1 Count pairs whose sum is a multiple of m + +Given N array elements, find count of pairs (i, j) such that $(arr[i] + arr[j]) ~\%~ m = 0$ + +**Note:** $i~!=~j$ and pair(i, j) is same as pair(j, i) + +**Example** +`A[ ] = {4, 3, 6, 3, 8, 12}` +`m = 6` + +Pairs that satisfy **$(arr[i] + arr[j]) ~\%~ 6 = 0$** are: +`(4 + 8) % 6 = 0` +`(3 + 3) % 6 = 0` +`(6 + 12) % 6 = 0` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Brute Force Approach + +* For each pair of distinct indices `i` and `j` (where `i != j`), the sum $arr[i] ~+~ arr[j]$ is calculated, and then the remainder of this sum when divided by `m` is checked. +* If the remainder is 0, then the pair `(i, j)` satisfies the condition, and the count is incremented. This approach has a time complexity of $O(N^2)$, where N is the number of elements in the array, as it involves checking all possible pairs. + +#### Optimal Approach + +**Hint:** +We can utilise the property: $(a + b) \% m = (a \% m + b \% m) \% m$ +Instead of directly checking for $(a+b)\%m$, we can check for $(a ~\%~ m ~+~ b \% m) \% m$ + +**Idea:** +* Iterate through the array and calculate `A[i] % m` for all values. +* Now, the sum of `A[i] % m` for two values should be divisible by m. + + +**Example**: +```java +A[ ] = {2, 3, 4, 8, 6, 15, 5, 12, 17, 7, 18} +m = 6 +``` +After doing mod with 6, we'll get +```java +{2, 3, 4, 2, 0, 3, 5, 0, 5, 1, 0} +Note: The range of A[i] % 6 is from 0 to 5 +``` +* Summing 1 with 5 will give sum divisible by 6. +* Likewise, 2 with 4, 3 with 3, and lastly 0 with 0. + +#### Algorithm + +* Iterate given array and calculate $A[i]\%m$. +* Create a frequency array of size **m** to store the frequency of remainders obtained from the elements. +* For each element, find the complement remainder needed for the sum to be divisible by `m`. Count frequency of complement remainder. Add these counts to get the total count of pairs satisfying the condition. +* **Note:** Mod 0 will form a pair with 0, i.e if m = 6, and say 12 & 18 are present in given array, doing 12 % 6 and 18 % 6 will result in 0. + +#### Dry Run +```java +A[ ] = {2, 3, 4, 8, 6, 15, 5, 12, 17, 7, 18} +m = 6 +``` +After doing mod with 6, we'll get +```java +{2, 3, 4, 2, 0, 3, 5, 0, 5, 1, 0} +``` + +* We'll keep inserting frequency of elements in frequency array while iterating over remainder values - + +| Remainder | Pair for it | Frequency | Count | Freq array | +|:---------:|:-------------------:|:----------------------------------------------------------------------:|:-----:| --- | +| 2 | $6-2 = 4$ | 4 is not yet present, but insert 2 for future use. | 0 | 2:1 | +| 3 | $6-3 = 3$ | 3 is not yet present, but insert 3 for future use. | 0 | 2:1 3:1 | +| 4 | $6-4 = 2$ | 2 is present with freq 1, count += 1 i.e, **1**; insert 4 for future use | 1 | 2:1 3:1 4:1 | +| 2 | $6-2 = 4$ | 4 is present with freq 1, count += 1 i.e, **2**; update frequency of 2. | 2 | 2:2 3:1 4:1 | +| 0 | 0 forms pair with 0 | 0 is not yet present, but insert 0 for future use. | 2 | 2:2 3:1 4:1 0:1 | +| 3 | $6-3 = 3$ | 3 is present with freq 1, count += 1 i.e, **3**; update frequency of 3. | 3 | 2:2 3:2 4:1 0:1 | +| 5 | $6-5 = 1$ | 1 is not yet present, but insert 5 for future use. | 3 | 2:2 3:2 4:1 0:1 5:1 | +| 0 | 0 forms pair with 0 | 0 is present with freq 1, count += 1 i.e, **4**; update frequency of 0. | 4 | 2:2 3:2 4:1 0:2 5:1 | +| 5 | $6-5 = 1$ | 1 is not yet present, but update frequency of 5 | 4 | 2:2 3:2 4:1 0:2 5:2 | +| 1 | $6-1 = 5$ | 5 is present with freq 2, count += 2 i.e, **6**; update frequency of 1. | 6 | 2:2 3:2 4:1 0:2 5:2 1:1 | +| 0 | 0 forms pair with 0 | 0 is present with freq 2, count += 2 i.e, **8**; update frequency of 0. | 8 | 2:2 3:2 4:1 0:3 5:2 1:1 | + + + + + +#### Pseudocode + +```cpp +int pairSumDivisibleByM(A, m) { + N = A.length; + freq[N] = { + 0 + }; + count = 0; + + for (int i = 0; i < N; i++) { + val = A[i] % m; + + if (val == 0) { + pair = 0; + } else { + pair = m - val; + } + ans += freq[pair]; + freq[val]++; + } + + return count; +} +``` + +**Time Complexity** - `O(N)` + + +--- +### Question + +**Space Complexity**: Pair Sum Divisible by M + +**Choices** + +- [ ] O(N) +- [x] O(M) +- [ ] O(N+M) + +**Explanation** + +Space Complexity (SC) is `O(M)`, where M is the modulus value. This is because the frequency array of size M is required to store frequency of elements from 0 to M-1. + +--- +## GCD Basics + +### Explanation + +* GCD - Greatest Common Division +* HCF - Highest Common Factor +* GCD(A, B) - Greatest factor that divides both a and b + +If we have `GCD(A, B) = x` + +This implies:- + +* A % x = 0 +* B % x = 0 + +and hence `x` is the highest factor of both A and B + +**Example - 1** + +GCD(15, 25) = 5 + + + + +**Example - 2** + +GCD(12, 30) = 6 + + + +**Example - 3** + +GCD(0, 4) = 4 + + + + + +**Example - 4** + +GCD(0, 0) = Infinity + + + + +--- +## Properties of GCD + +### Property - 1 + +GCD(A, B) = GCD(B, A) + +### Property - 2 + +GCD(0, A) = A + +### Property - 3 + +GCD(A, B, C) = GCD(A, GCD(B, C)) = GCD(B, GCD(C, A)) = GCD(C, GCD(A, B)) + + + +### Property - 4 + +Given `A >= B > 0`, +**GCD(A, B) = GCD(A - B, B)** + + +**Example:** + + + +### Property - 5 + +GCD(A, B) = GCD(A % B, B) + +--- +### Question +gcd(0,8) = ? +Chose the correct answer + +**Choices** +- [ ] 1 +- [x] 8 +- [ ] 0 +- [ ] not defined + + +--- +### Question +TC of gcd(a1,a2,a3,....,an) is: +Chose the correct answer + +**Choices** +- [ ] O(log(max number)) +- [ ] O(N) +- [x] O(N*log(max number) +- [ ] O(N^2) + +--- +### Question +Given an array A = [15, 21, 33, 45], find the GCD of all elements in the array. + +**Choices** +- [ ] 4 +- [x] 3 +- [ ] 6 +- [ ] 9 + +--- +## Function of GCD + +### Write a function to find GCD(A, B) + + + + +Suppose we have two positive numbers a, b then: + +```java +int gcd(a, b) { + if (b == 0) { + return a; + } + return gcd(b, a % b); +} +``` + +**Time Complexity(TC):** O(log(max(a, b))) + +### Given an array, calculate GCD of the entire array + +**Example:** + + + +```java +int gcdArr(int[] arr) { + int ans = arr[0]; + int n = arr.length(); + for (int i = 0; i < n; i++) { + ans = gcd(ans, arr[i]) + } + return ans; +} +``` +--- +### Problem 2 Delete One + +**Question** + +Given arr[N] elements , we have to delete one element such that GCD of the remaining elements becomes maximum. + +**Example:** + + + +#### Brute Force Approach + +The brute approach for this problem will be to delete arr[i], and then calculate the GCD for all the remaining elements. This will be repeated for all the elements. + + + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +#### Optimal Approach: Prefix Array + + +**Approach:** + +* Idea is to find the GCD value of all the sub-sequences of length (N – 1) and removing the element which is not present in the sub-sequence with that GCD. The maximum GCD found would be the answer. +* To find the GCD of the sub-sequences optimally, maintain a `prefixGCD[]` and a `suffixGCD[]` array using single state dynamic programming. +* The maximum value of GCD(`prefixGCD[i – 1]`, `suffixGCD[i + 1]`) is the required answer. + +The implementation is given below: + +```java + // Recursive function to return gcd of a and b + static int gcd(int a, int b) { + if (b == 0) + return a; + return gcd(b, a % b); + } + + static int MaxGCD(int a[], int n) { + + // Prefix and Suffix arrays + int Prefix[] = new int[n + 2]; + int Suffix[] = new int[n + 2] ; + + Prefix[1] = a[0]; + for (int i = 2; i <= n; i += 1) { + Prefix[i] = gcd(Prefix[i - 1], a[i - 1]); + } + + Suffix[n] = a[n - 1]; + for (int i = n - 1; i >= 1; i -= 1) { + Suffix[i] = gcd(Suffix[i + 1], a[i - 1]); + } + + // If first or last element of the array has to be removed + int ans = Math.max(Suffix[2], Prefix[n - 1]); + + // If any other element is replaced + for (int i = 2; i < n; i += 1) { + ans = Math.max(ans, gcd(Prefix[i - 1], Suffix[i + 1])); + } + return ans; + } +``` + + + +--- +### Proof of gcd(a, b) = gcd(a-b, b) + + + \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Maths 2 Combinatorics Basics.md b/Academy DSA Typed Notes/Advanced/DSA Maths 2 Combinatorics Basics.md new file mode 100644 index 0000000..49d8d2e --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Maths 2 Combinatorics Basics.md @@ -0,0 +1,339 @@ +# Maths 2: Combinatorics Basic + + +--- +## Addition and Multiplication Rule Example 1 + +### Example - 1 + +Given 10 girls and 7 boys, How many different pairs can be formed? + +**Note: pair = 1 boy + 1 girl** + + + +Since each pair consists of one boy and one girl, you can pair each of the 7 boys with any of the 10 girls. This results in a total of 7 boys × 10 girls = 70 different pairs that can be formed. + +--- +### Addition and Multiplication Rule Example 2 + +### Example - 2 + + + + +**Approach:** + + + +To reach Agra via Delhi from Pune, you can combine the ways to get from Pune to Delhi (3 ways) with the ways to get from Delhi to Agra (2 ways). + +So, the total number of ways to reach Agra via Delhi from Pune is: + +3 ways (Pune to Delhi) * 2 ways (Delhi to Agra) = 6 ways. + +--- + + +# Question + +No. of ways of reaching Agra from Pune ? + + +# Choices + +- [ ] 72 +- [ ] 12 +- [x] 18 +- [ ] 20 + +To go to Pune to delhi , there are 3 ways. And do go from delhi to agra there are 4 ways. From pune to Mumbai there are 2 ways, from Mumbai to agra there are 3 ways. + + + +To calculate the number of ways to reach Agra from Pune through different routes, you need to consider the combination of routes from Pune to Delhi and from Delhi to Agra, as well as the routes from Pune to Mumbai and from Mumbai to Agra. Then, you can add these possibilities together. + +From Pune to Delhi, there are 3 ways. +From Delhi to Agra, there are 4 ways. + +From Pune to Mumbai, there are 2 ways. +From Mumbai to Agra, there are 3 ways. + +So, to find the total number of ways to reach Agra from Pune via these routes, you add the possibilities: + +(3 ways from Pune to Delhi * 4 ways from Delhi to Agra) + (2 ways from Pune to Mumbai * 3 ways from Mumbai to Agra) = $(3 * 4) + (2 * 3) = 12 + 6 = 18$ ways. + +There are 18 different ways to reach Agra from Pune through these routes. + +* (Multiplication) = AND: Used when counting possibilities that occur together in sequence. +* (Addition) = OR: Used when counting possibilities that occur in separate ways. + + + +--- +## Permutation + + +### Explanation + +Permutation is defined as the arrangements of objects. In permutation, **order matters**. To simplify `(i, j) != (j, i)` + +### Example - 1 + +Given 3 distinct characters, in how many ways can we arrange them? + +**Approach:** + + + +--- + +### Question + +In how many ways n distinct characters can be arranged? + +**Choices** + +- [ ] N * (N + 1) / 2 +- [x] N! (N Factorial) +- [ ] N ^ 2 +- [ ] N + + +### Explanation: + +N distinct characters can be arranged in n! (n factorial) ways. This means that for each distinct character you have, you can multiply the total number of arrangements by the count of characters. Here's the formula: + + + +--- +## nPr Formulae + +### Example - 2 + +Given N distinct characters, in how many ways you can arrange R out of N distinct chracters? + + + +**Approach:** + +When arranging 2 distinct characters from a set of 4, and order matters (e.g., AB and BA are considered different arrangements), the number of ways is indeed $4 * 3 = 12$ ways. + +When arranging **R** characters out of **N** distinct characters: + +* For the first position, you have **N** choices +* For the second position, since you've used one character, you have **N-1** choices. +* For the third position, you have **N-2** choices, and so on. + +This continues until the **R-th** position, for which you have $N-(R-1)$ choices. + +Thus, the total number of ways to arrange **R** characters out of **N** distinct characters is `N ∗ (N − 1) ∗ (N − 2) ∗ ... ∗ (N − (R − 1))`. + + + + + + + + +Here: + +* **n** is the total number of distinct characters. +* **r** is the number of characters you want to arrange. +* **nPr** represents the permutations of **n** items taken **r** at a time. + +--- +## Combination + +### Explanation + +Combination is defined as the number of ways to select something. + +**Note:** In combination, **order of selection does not matter**. To simplify `(i, j) = (j, i)` + + +### Example - 1 + +Given 4 players, count the number of ways of selecting 3 players. + + + +### Example - 2 + +Given 4 players, write the number of ways to arrange players in 3 slots + + + +* **Number of Selections (x):** You are selecting 3 players out of 4, which is represented as **4C3**, and it equals 4. +* **Number of Arrangements in Each Selection (6):** There are 3! (3 factorial) ways to arrange 3 players within 3 slots, which is 6. +* **Total Number of Arrangements:** Multiply the number of selections by the number of arrangements in each selection: + +Number of Selections * Number of Arrangements in Each Selection = $4 * 6 = 24$ + + + + +--- +## nCr Formulae + +### Example - 3 + +Given **n** distinct elements, in how many ways we can select **r** elements s.t `0 <= r <= n` + + + + + + + + + + +--- +## Properties of Combination + +### Property - 1 + + The number of ways of selecting **0** items from **N** items, i.e. number of ways to **not select anything**, will always be **1**. + + + +### Property - 2 + +The number of ways of selecting **n** items from **n**, i.e. number of ways to **select everything** will also be **1**. + + + + +### Property - 3 + +Number of ways of selecting **(n-r)** items from **n**: + + + +--- +## Special Property + + +### Property - 4 + +Given **n** distinct elements, select **r** items: + +For each elements, we have 2 options, either to select or not select: + + + +**Select Case:** +When you choose to "select" an element from the available n distinct elements, it means that you are including that specific element as one of the r items you want to pick. In this case: + +* You decrease the number of items you need to select by 1, so it becomes r - 1. +* You decrease the total number of available elements by 1, as you've already chosen one element, so it becomes n - 1. +* You continue the selection process, considering the reduced values of r and n. + +**Reject Case:** +When you choose to "reject" an element, it means that you are not including that particular element as part of your selection. In this case: + +* You keep the number of items you need to select the same, which remains as r. +* You decrease the total number of available elements by 1, as you've decided not to choose one element, so it becomes n - 1. +* You continue the selection process with the same value of r and the reduced value of n. + +--- +## Problem 1 Pascal Triangle + +Generate Pascal's triangle for given value of `n`. + +**Example** + +Pascal Triangle for `n = 4` is given below + + + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Brute Force:** For each and every value, calculate the factorial and print it. + +`c[i][j]` represents the element in the i-th and j-th column. Each element is the sum of the two numbers directly above it from the previous row. In combinatorial terms, `c[i][j]` indicates the number of ways to choose j items from a set of i items without repetition and without order. + +But as we know that, factorial grows very fast as the number increases, hence this approach won't work properly. + +### Optimized Approach + +* Pascal's Triangle elements are calculated using `c[i][j] = c[i - 1][j] + c[i - 1][j - 1]`, summing elements from the row above. +* Start with `c[0][0] = 1`, forming the foundation of the triangle. +* Calculate rows iteratively using the relation, reusing previous row values to minimize redundant calculations. +* Utilize only two rows (previous and current) to calculate and update elements, saving memory. +* Print each row's elements to see Pascal's Triangle emerge from the calculated values. + + + +### Pseudo Code + +```java +void pascalsTriangle(int n) { + nCr[n][n] = {0}; + for (int i = 0; i < n; i++) { + nCr[i][0] = 1; + nCr[i][i] = 1; + for (int j = 1; j < i; j++) { + nCr[i][j] = nCr[i-1][j] + nCr[i-1][j-1]; + // If mentioned in the question to take % M then: + // nCr[i][j] = (nCr[i-1][j] + nCr[i-1][j-1]) % M; + } + return nCr; + } +} +``` + +### Complexity +**Time Complexity:** $O(N^2)$ +**Space Complexity:** $O(N^2)$ + +--- +### Problem 2 Finding N-th column title + +Find the n-th column title, the columns are titled as A, B, C... and after Z, it is AA, AB, AC... and so on. Given the column number, find the title of the column. + + + + +Base for mapping A-Z will be 26 + +#### Example + + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach + +* Start with the given number **n**. +* For each digit of the column title (from right to left): + * Find the remainder when **n** is divided by 26. + * Map the remainder to the corresponding letter ('A' to 'Y' for 1-25, 'Z' for 0). + * Append the letter to the Excel column title. + * Divide **n** by **26** (integer division) to process the next digit. +* Repeat step 2 until n becomes zero. +* The resulting string is the Excel column title for the original number n. + + +#### Code +```java +void columnTitle(int n) { + ans = ""; + while(n > 0) { + ans = (char) ((n - 1) % 26 + 'A') + ans; // char + string + n = (n - 1) / 26 + } + return ans +} +``` + +#### Complexity +**Time Complexity:** O(log(N)) [base 26] +**Space Complexity:** O(1) + diff --git a/Academy DSA Typed Notes/Advanced/DSA Maths 3 Prime Numbers.md b/Academy DSA Typed Notes/Advanced/DSA Maths 3 Prime Numbers.md new file mode 100644 index 0000000..b9fc846 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Maths 3 Prime Numbers.md @@ -0,0 +1,300 @@ +# Maths 3: Prime Numbers + +--- +## Introduction to Prime Numbers + + +### What are Prime Numbers? + +Numbers having only 2 factors i.e, 1 and the number itself are known as Prime Numbers + +**Example:** 2, 5, 7, 11 + +--- +### Problem 1 Check if a number is prime or not + +Given a number, we need to check wheather its a prime number or not + +**Example** +**Input:** +``` +n = 3 + +n = 4 +``` + +**Output:** +``` +true + +false +``` + +--- +### Question +Check whether 11 is a prime number or not! + +**Choices** +- [x] true, 11 is a prime number +- [ ] false, 11 is not a prime number + + + +### Approach + +* We need to count the number of factors: + * if factors = 2, then it is prime + * otherwise if factors >2, then it is non prime + + +### Code snippet + +```java +boolean checkPrime(int n) { + count = 0; + for (int i = 1; i * i <= n; i++) { + if (n % i == 0) { + if (i == n / i) { + count++; + } else { + count += 2; + } + } + } + if (count == 2) { + print("prime"); + } else { + print("Not Prime"); + } +} +``` + +--- +## Problem 2 Print all prime numbers from 1 to N + +Given a number N, we need to print all the prime no. from 1 to N + +**Example** + + +### Question +Find all the prime numbers from 1 to N + +**Choices** +- [ ] 1, 2, 3, 5, 7 +- [ ] 2, 3, 5, 7, 8 +- [x] 2, 3, 5, 7 +- [ ] 2, 5 ,7 + +### Solution +**Brute Force:** Iterate from 1 to N, and check if a number is prime or not. + +```java +void printAllPrime(int n) { + for (int i = 2; i <= n; ++i) { + boolean isPrime = true; + for (int j = 2; j * j <= i; ++j) { + if (i % j == 0) { + isPrime = false; + break; + } + } + } +``` + +* **Time Complexity (TC):** The time complexity of the given function is $O(n√n)$, as it iterates through numbers from 2 to N and for each number, it checks divisibility up to the square root of that number. +* **Space Complexity (SC):** The space complexity is O(1), as the function uses a constant amount of extra space regardless of the input size. + +--- +## Sieve of Eratosthenes + +### Optimized approach for counting number of primes between 1 to N + +**Approach** + +* **Assumption:** Begin by assuming that all numbers from 2 to N are prime numbers. +* **Marking Non-Primes:** Start with the first prime number, which is 2. Since 2 is a prime number, mark all its multiples as non-prime. These multiples are 4, 6, 8, and so on. +* **Move to Next Unmarked Number:** Move to the next unmarked number, which is 3. Since 3 is a prime number, mark all its multiples as non-prime. These multiples are 6, 9, 12, and so on. Notice that we skip numbers that have already been marked as non-prime in previous steps. Unmarked numbers are prime as they do not have any number less then themselves a factor of the number except 1. Which means they are prime +* **Repeat for Remaining Unmarked Numbers:** Continue this process for the remaining unmarked numbers, each time marking all their multiples as non-prime. +* **Completion:** After going through all numbers up to the square root of N, the remaining unmarked numbers are prime numbers. This is because their multiples have been marked as non-prime in previous steps. + + + +### Code Snippet + +```java +void printAllPrime(int n) { + boolean[] isPrime = new boolean[n + 1]; // Initialize a boolean array to track prime numbers + Arrays.fill(isPrime, 2, n + 1, true); // Assume all numbers from 2 to n are prime + + for (int i = 2; i * i <= n; ++i) { + if (isPrime[i]) { + for (int j = i * i; j <= n; j += i) { + isPrime[j] = false; // Mark multiples of the current prime as non-prime + } + } + } +} +``` + +### Optimization in Sieve of Eratosthenes + + + +Starting from the square of each prime number, mark all its multiples as non-prime in the sieve. This is efficient because smaller multiples of the prime would have already been marked by smaller primes. By avoiding redundant marking, we optimize the Sieve of Eratosthenes algorithm. + + + + + +* **Time Complexity (TC):** The optimized Sieve of Eratosthenes has a time complexity of O(n log log n), which means it grows very slowly. This is because the algorithm only visits and marks numbers up to the square root of N, and the number of non-prime numbers marked is logarithmic with respect to N. +* **Space Complexity (SC):** The space complexity is O(n), which is used to store the boolean array indicating whether each number is prime or not. The space used is directly proportional to the input size N. + +--- +### Problem 3 Smallest Prime Factor + +Given N, return the smallest prime factors for all numbers from 2 to N + +**Example:** + + + +### Question +What is the smallest prime factor of 25 + +**Choices** +- [ ] 1 +- [x] 5 +- [ ] 10 +- [ ] 25 + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Smallest Prime Factor Approach + +* **Initialization:** Create an integer array to store the smallest prime factors for each number from 2 to N. Initialize each element of the array to its own value, indicating that it's not yet known if the number is prime or not. +* **Smallest Prime Factor Determination:** Starting from the first prime number (2), for each prime number: + * If the smallest prime factor for a number is still its own value (indicating it's not determined yet), mark it as the smallest prime factor for all its multiples. +* **Iterate Over All Numbers:** Go through each number from 2 to N, and for each number, if its smallest prime factor is still itself, mark it as prime and set its smallest prime factor to itself. +* **Smallest Prime Factors:** The array will now hold the smallest prime factors for all numbers from 2 to N. + + + +```java +public int[] smallestPrimeFactors(int n) { + int[] spf = new int[n + 1]; + + for (int i = 2; i <= n; ++i) { + spf[i] = i; // Initialize smallest prime factor with its own value + + if (spf[i] == i) { // i is prime + for (int j = i * i; j <= n; j += i) { + if (spf[j] == j) { + spf[j] = i; // Mark smallest prime factor for multiples + } + } + } + } + + return spf; +} +``` + +--- +## Prime Factorization + +Prime factorization is the process of finding the prime numbers, which are multiplied together to get the original number. For example, the prime factors of 16 are $2 × 2 × 2 × 2$. + + + + + + + + +--- +### Problem 4 Total Number of Factors + +Given a number n, assume its prime factorization + +$n=i^{a1}*j^{a2}*k^{a3}...z^{ax}$ + +the number of choices we have for the power of every prime is [0, a1], [0,a2], [0, a3].............[0, ax] + +the number of divisor/factors will be given by the formula: + +(a1 + 1)*(a2 + 1)*(a3 + 1)*.....(ax + 1) + + +Example + +**Example 1** +$25 = 5^2$ + +Number of divisors = $(2+1) = 3$ + + +**Example 2** + + + +### Question +Find the total number of factors of 20 + +**Choices** +- [x] 5 +- [ ] 1 +- [ ] 3 +- [ ] 4 + + +**Explanation:** + +20 = 2^2^ * 5^1^ + = (2 + 1) * (1 + 1) + = 5 + + +The factors are 1, 2, 5, 10, 20. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +--- +### Total Number of Factors Approach + +#### Approach + +* **Prime Factorization:** For each number from 1 to N, find its prime factorization. Determine the prime factors of the number and their respective powers. +* **Counting Factors:** The number of factors for a given number is calculated by adding 1 to each power of its prime factors and then multiplying those incremented powers together. +* **Iterate through Numbers:** Iterate through the numbers from 1 to N. For each number: + * Calculate its prime factorization. + * Count the factors using the prime factors' powers. +* **Store or Output Results:** Store or output the number of factors/divisors for each number. + +The number of factors for a given number is calculated by adding 1 to each power of its prime factors and then multiplying those incremented powers together. + +* **For 1:** $(1+1) = 2$ factors (1 and itself). +* **For 2:** $(1+1) = 2$ factors (1 and 2). +* **For 3:** $(1+1) = 2$ factors (1 and 3). +* **For 4:** $(2+1) = 3$ factors (1, 2, and 4). +* **For 5:** $(1+1) = 2$ factors (1 and 5). +* **For 6:** $(1+1) * (1+1) = 4$ factors (1, 2, 3, and 6). +* **For 7:** $(1+1) = 2$ factors (1 and 7). +* **For 8:** $(3+1) = 4$ factors (1, 2, 4, and 8). +* **For 9:** $(2+1) = 3$ factors (1, 3, and 9). +* **For 10:** $(1+1) * (1+1) = 4$ factors (1, 2, 5, and 10). + + + +#### Code + + + +* **Time Complexity (TC):** The time complexity of this code is O(N * log N), mainly due to the prime factorization process for each number from 1 to N. +* **Space Complexity (SC):** The space complexity is O(N), where the primary space usage comes from the arrays for storing the smallest prime factors and the hashmap for storing the factors count for each number. diff --git a/Academy DSA Typed Notes/Advanced/DSA OOPS 1 Introduction.md b/Academy DSA Typed Notes/Advanced/DSA OOPS 1 Introduction.md new file mode 100644 index 0000000..091d661 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA OOPS 1 Introduction.md @@ -0,0 +1,488 @@ +# OOPS 1 + + +### Programming Paradigms + +Types: +* **Imperative Programming** - It tells the computer how to do the task by giving a set of instructions in a particular order i.e. line by line. +```cpp +// For eg: +int a = 10; +int b = 20; +int sum = a + b; +print(sum); +int dif = a - b; +print(dif); +``` +* **Procedural Programming** - It splits the entire program into small procedures or functions (section of code that perform a specific task) which are reusable code blocks. +```cpp +// For eg: +int a = 10; +int b = 20; +addTwoNumbers(a, b); +subtractTwoNumbers(a, b); + +void addTwoNumbers(a, b) { + int sum = a + b; + print(sum); +} + +void subtractTwoNumbers(a, b) { + int dif = a - b; + print(dif); +} +``` + +* **Object Oriented Programming** - It builds the entire program using classes and objects. [will discuss this in detail today!] + +* **Declarative Programming** - In this paradigm, you specify "what" you want the program to do without specifying "how" it should be done. +```SQL +-- For eg: (SQL Queries) +select * from Customer; +``` +* **Functional Programming**, **Logic Programming**, etc. + +Most of the people start their coding journey with procedural programming and hence let's start with the first type of paradigm i.e. procedural programming. + +--- +## Procedural Programming +It splits the entire program into small procedures or functions (section of code that perform a specific task) which are reusable code blocks. Eg - C, C++, etc. + +Procedure is an oldage name of function/method. + +```cpp +// For eg: +void addTwoNumbers(a, b) { + int sum = a + b; + print(sum); +} + +void addThreeNumbers(a, b, c) { + int sum = a + b; + addTwoNumbers(sum, c); +} + +void main() { + addThreeNumbers(10, 20, 30); +} +``` +--- +### Problems with Procedural Programming + +**Cons of Procedural programming:** +* Difficult to make sense +* Difficult to debug and understand +* Spaghetti code i.e. unstructured and needs to be tracked form multiple locations. + +So this is all about procedural programming, now lets move to OOPs as we are preparing for the base of OOPs. + +--- +## Object Oriented Programming Introduction + +### OOPS + +OOPs came from the need of thinking of software systems in terms of how we humans think about real world. +* Entities are core in OOPs +* Every entity has some attribute and behaviour + +In object oriented programming we build the entire program using classes and objects (entity). + +**Class:** Blueprint of an idea. + +Example - Floor plan of an apartment. +So, while designing new house, we make something called blue print. + + +Now this will have exact dimensions as per need. Is the house built? No not yet, but whenever it will get built, the design will be look like this. + +**Class represent the strucutre of the idea.** +Class has attributes to define data and methods to define functionalities/behaviour. + +Lets build a `Student` class with some attributes and methods. + +Its the basic structure, its not a real thing, it just show what data every student holds upto. Also, You can create multiple instances of this class. + + +**Object:** They are real instances of the class. + +### Question + +Will the object of a class occupy memory? + +**Choices** + +- [ ] No +- [ ] In some cases only +- [x] Yes + + +Yes they will occupy memory because they are real instance of the class / blueprint. + +--- +### Classes & Objects Example + +Now lets create a class and object and see how this thing works on machine. + +1. We will create a class named Student + + +```java +} +``` + +2. Then, we will create the main class + + + +3. And we can see that both naman and dinesh have their own identity + + +--- +### Pillars of Object Oriented Programming + +Now what is principle and pillar? +* **Principle** - Fundamental foundation / concept. +* **Pillar** - Support to hold things together + + +**So what does the principle of OOP says?** + +Idea of OOP is based on **abstraction** and the whole software system is build around abstraction. + +But how would we implement the abstraction? ---> Using the 3 pillars of OOPs i.e. +* **Inheritance** +* **Polymorphism** +* **Encapsulation** + + +**For example:** + +Your **principal** can be: +- I will be a good person. + +But how you would be a good person? Here comes your **pillars**: +- I will be truthfull, +- I will do hardwork, +- I respect everyone, etc. + +So we got to know that abstraction is not the pillar of OOPs, it is the main principle on which whole concept of OOP is based. + + +--- +### OOPs Abstraction + +Abstraction means ---> **Representing in terms of ideas**. + +Now what does ideas mean? ---> Anything in software system that has attrubute and associated behaviour. + +So if you are building scaler, you don't have to think about storing individuals like, Naman, Anshuman, Indarjeet. You can use Students, Mentors, TAs, Classes, etc. with their attributes. + +**Do they have a behaviour?** + +Yes they all have some behaviour. Student can send messages, pause courses these are all behaviours. +So abstraction is an idea of representing complex software system interms of ideas, because ideas are easy to understand. +So, its an concept of making something abstract. + +### What is the purpose of abstraction? + +The main purpose is that others dont need to know the details of the idea. + +Suppose you are driving a car, and you want it to turn left and speed up, and you steer the steering to left and press the acceleration pedal. It works right? Do you need to know how does this happen? What combustion is happening, how much fuel is used, How steering wheel turned the car? +No right? This is what we call as abstraction. + +Abstraction is way to represent complex software system, in terms of ideas. + +What needed to be represented in terms of ideas? +* Data +* Anything that has behaviours + +No one else need to know the details about the ideas. + +Now let's move to encapsulation. + +--- +## OOPs Encapsulation + + +So what are the purpose for making capsules, and not normal medicine? + +If the capsule breaks away, what will happen? +- It will flow away. So first purpose is to hold the medicine powder together. +- Then there are multiple powders are present in the capsule, it helps them to avoid mixing with each other. +- Third purpose is it protects the medicine from the outside environment. + +This is exactly the purpose of Encapsulation in OOP. + +Encapsulation allows us to store attribute and Behaviours together. + +### Question + +Where do we store attribute and behavious together? What is the technical term for that? + +**Choices** + +- [x] Class +- [ ] Object +- [ ] Project + + + +Yes, a **class**, and it protects attributes & methods from outer environment i.e. other classes can't have access to it if we restrict. + + + +Here no one can access the age of student other than the class student. + +--- +## Access Modifiers + +We got to know that Encapsulation has two advantages, +* ONE is it holds data and attributes together and +* SECOND is it protect members from illegitimate access. You can't access the data from class unless the class allows you to. + +Now, The first thing gets sorted by class, i.e. we create a class, and it holds the behaviors and attributes together. + +But, **How the SECOND one is implemented?** +i.e., How in code illegitimate access is prevented? +How the encapsulation prevents access to class data? + +That is something called **access modifiers**. + +--- +### Question + +Which one of these is **not** an access modifier? + +**Choices** + +- [ ] Public +- [x] Open +- [ ] Private +- [ ] Protected + +--- +### Types of Access Modifiers + +There are four access modifiers in most of the programming languages, they are: +* **Public** +* **Private** +* **Protected** +* **Default** (if we don't use any of the above three, then its the default one) + +So what are these access modifiers? Let's quickly look at them. + +**Public access modifier** - A public attribute or method can be accessed by everyone. + +**Private access modifiers** - A private attribute or method can be accessed by no one, not even the child class. +**Explanation** - It can be accessed by the **same** class. No one outside the class has access to private methods. + +**Protected access modifier** - A protected attribute or method can be accessed only from the classes of the same package. + +Let me show you a diagram that will be helpful in understanding and will clear most of your doubts. + +where: + +--- +### Question + +Which is the **most restricted** access modifier? + +**Choices** + +- [ ] Public +- [ ] Default +- [x] Private +- [ ] Protected + +--- +### Question + +Which is the **most open** access modifier? + +**Choices** + +- [x] Public +- [ ] Default +- [ ] Private +- [ ] Protected + +--- +### `this` Keyword + +Before we see the example of access modifier, let's understand **"this" keyword**: +* In programming, "this" is a keyword used to refer to the **current instance of a class or object**. +* It's typically used to distinguish between instance variables and local variables or method parameters with the same names, and to access or modify instance members within methods. +* This enhances code clarity and prevents naming conflicts in object-oriented languages like Java and C++. + +Here is an example: +```Java +public class Person { + private String name; + + public Person(String name) { + this.name = name; // "this" refers to the current instance of the class + } + + public void introduceYourself() { + System.out.println("Hello, I am " + this.name); // Using "this" to access the instance variable + } + + public static void main(String[] args) { + Person person1 = new Person("Alice"); + Person person2 = new Person("Bob"); + + person1.introduceYourself(); // Output: Hello, I am Alice + person2.introduceYourself(); // Output: Hello, I am Bob + } +} +``` +In this example, the "this" keyword is used to differentiate between the instance variable name and the constructor parameter name, ensuring that the correct value is assigned and accessed within the class methods. + +--- +### Example of Access Modifiers + +```Java +package mypackage; + +public class AccessModifierExample { + public int publicVariable = 10; // Public access + + private int privateVariable = 20; // Private access + + protected int protectedVariable = 30; // Protected access + + int defaultVariable = 40; // Default (package-private) access + + public void publicMethod() { + System.out.println("This is a public method."); + } + + private void privateMethod() { + System.out.println("This is a private method."); + } + + public static void main(String[] args) { + AccessModifierExample example = new AccessModifierExample(); + + System.out.println("Public variable: " + example.publicVariable); + System.out.println("Private variable: " + example.privateVariable); + System.out.println("Protected variable: " + example.protectedVariable); + System.out.println("Default variable: " + example.defaultVariable); + } +} +``` +```Java +package otherpackage; + +import mypackage.AccessModifierExample; // Import the class from a different package + +public class AnotherClass { + public static void main(String[] args) { + AccessModifierExample example = new AccessModifierExample(); + + System.out.println(example.publicVariable); // Accessing publicVariable is valid + System.out.println(example.defaultVariable); // Error: Cannot access defaultVariable from a different package + + example.publicMethod(); + example.privateMethod(); // Error: Private method is not accessible outside the class + } +} +``` +In this example: + +The class **AccessModifierExample** has variables and methods with different access modifiers: public, private, protected, and default. +Access modifiers control the visibility and accessibility of members (variables and methods) outside the class. +Public members are accessible from anywhere, private members are only accessible within the class, protected members are accessible within the class and its subclasses, and default members are accessible within the same package. + +Now, you can try all these on your machine just by creating classes and accessing them. + +--- + +### `static` Keyword + +The **static** keyword in programming languages like Java and C++ is used to declare **class-level members or methods**, which are associated with the class itself rather than with instances (objects) of the class. + +1. **Static Variables (Class Variables):** When you declare a variable as "static" within a class, it becomes a class variable. These variables are shared among all instances of the class. They are initialized only once when the class is loaded, and their values are common to all objects of the class. + +2. **Static Methods (Class Methods):** When you declare a method as "static," it becomes a class method. These methods are invoked on the class itself, not on instances of the class. They can access static variables and perform operations that don't require access to instance-specific data. + +The **static** keyword is often used for utility methods and constants that are relevant at the class level rather than the instance level. It allows you to access these members without creating an object of the class. + +Static variable is created when we load a class. + +Here is an example: +```Java +public class MyClass { + // Static variable + static int staticVar = 0; + + // Instance variable + int instanceVar; + + public MyClass(int value) { + this.instanceVar = value; + staticVar++; + } + + public static void main(String[] args) { + MyClass obj1 = new MyClass(10); + MyClass obj2 = new MyClass(20); + + System.out.println("Static Variable: " + staticVar); // Output: Static Variable: 2 + System.out.println("Instance Variable (obj1): " + obj1.instanceVar); // Output: Instance Variable (obj1): 10 + System.out.println("Instance Variable (obj2): " + obj2.instanceVar); // Output: Instance Variable (obj2): 20 + } +} +``` +In this example, we have a static variable **staticVar** and an instance variable **instanceVar**. The staticVar is incremented every time an object is created, and we access both static and instance variables directly within the main method. + +--- + +### Scope of a variable + +Now let's talk about scope of a variable within a program! + +In Java, scope refers to the region or context within your code where a specific variable or identifier is accessible and can be used. The scope of a variable is determined by where it is declared, and it influences its visibility and lifetime within the program. +**There are primarily four types of variable scope in Java:** + +1. **Class/Static Scope:** Variables declared as `static` within a class have class-level scope. These variables are associated with the class itself rather than with instances (objects) of the class. They can be accessed using the class name and are shared among all instances of the class. + +2. **Instance Scope:** Variables declared within a class but outside any method or constructor have instance scope. These are often referred to as instance variables, and they are associated with specific instances (objects) of the class. Each object has its own copy of these variables. + +3. **Method/Local Scope:** Variables declared within a method or a block of code have method or local scope. These variables are only accessible within the specific method or block where they are defined. They go out of scope when the method or block's execution is complete. + +4. **Block Scope:** Variables declared within a pair of curly braces `{}` have scope limited to that block. These variables are only accessible within the block in which they are defined. + +The scope of a variable is essential for ensuring that the right variables are accessed at the right time and for avoiding naming conflicts. Properly managing variable scope contributes to the clarity and reliability of your code. + +Here's a brief example to illustrate variable scope in Java: + +```java +public class ScopeExample { + // Class-level variable (static scope) + static int classVar = 10; + + // Instance variable (instance scope) + int instanceVar = 20; + + public void exampleMethod() { + // Method-level variable (method scope) + int methodVar = 30; + + if (true) { + // Block-level variable (block scope) + int blockVar = 40; + System.out.println(classVar + instanceVar + methodVar + blockVar); + } + // The 'blockVar' is out of scope here. + } + + public static void main(String[] args) { + ScopeExample obj = new ScopeExample(); + obj.exampleMethod(); + // The 'methodVar' and 'blockVar' are out of scope here. + } +} +``` + +In this example, you can see how variables with different scopes are defined and accessed within a Java class. diff --git a/Academy DSA Typed Notes/Advanced/DSA OOPS 2 Constuctors, Inheritance & Polymorphism.md b/Academy DSA Typed Notes/Advanced/DSA OOPS 2 Constuctors, Inheritance & Polymorphism.md new file mode 100644 index 0000000..6b50d85 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA OOPS 2 Constuctors, Inheritance & Polymorphism.md @@ -0,0 +1,660 @@ +# OOPs 2 +### Constructors + +If you remember, we have studied **classes and objects** in the previous lecture, so what is a class and object? Let's have a quick recap of it. + + +**Class:** Blueprint of an entity. +**Object:** Instance of class + +Now let's look at how a class comes into reality. + +Let's define a class named Student. +```java +Student { + String name; + int age; + doubly psp; +} +``` +Now, let's make an object of the Student class. +```java +Student st = new Student(); +``` +Now, from the basics of programming, we all know that to declare a variable, we write: +```java +int a = 12; +``` +Let's compare this with object creation: +```java +int a = 12; +Student st = new Student(); +``` +We can see that **Student** is the Data type here and **st** is a variable name, but + + +This thing => **Student();** is called a **constructor**, which creates the object of the class. + +This thing, when you don't create a constructor, is called a **default constructor**. Let's discuss it in detail. + +--- + +### Default Constructor +If we don't create our own constructor in a class, a **default constructor** is created. + +**Default constructor** creates a new object of the class and sets the value of each attribute as the default value of that type. + +Examples of default values of datatype: +* **0** for integer, +* **null** for String, +* **0.0** for float, etc. + +> **Note:** A default constructor will assign default values only if we haven't assigned values to class attributes while declaring the variable. + +So if we are not creating any constructor, then our class is going to make its own constructor. + +A default constructor can be assumed to be present like this: +```java +class Student { + String name; + int age; + double psp; + String univName; + + Student() { + name = null; + age = 0; + psp = 0.0; + univName = null; + } +} +``` + + + +But, +* By the definition of the default constructor, we know that, **if we create our own constructor** then a default constructor is not created. + +So, by looking at Student(), we can say that no parameters are passed here, right? +So, **the default constructors take no parameters**. + +**Summarising** the default constructor: +1. Takes no parameter. +2. Sets every attribute of class to it's default value (unless defined). +3. Created only if we don't write our own constructor. +4. It's public i.e. can be access from anywhere. + +--- + +### Manual Constructor +Now, let's create our own constructor using the same `Student` class + +```java +public class Student { + String name; + private int age = 21; + String univName; + double psp; + + public Student (String studentName, String universityName) { + name = studentName; + univName = universityName; + } +} +``` +Let's create a client class. +```java +public class Client { + public static void main(String[] args) { + Student st = new Student(); //ERROR +} +``` +But here, why its throwing error? +* Because now there is no default constructor, since we have our own constructor, and it has parameters. So we have to pass the parameters here. + +So, let's do like this, +```java +public class Client { +public static void main(String[] args) { + Student st = new Student("Utkarsh", "JIIT"); +} +``` + + +Now, let's move to the copy constructor and learn more about it. + +--- +### Copy Constructor + +Now, **What is a copy constructor?** +Let's say we already have an object of student class, and then we want to create a new object of student that has the exact same values of attributes as older objects. + +**For example:** + + +If `st1` as an object and we need to create one more object `st2`, with the same attribute values, we can do it with the copy constructor. + +```java +class Student { + String name; + int age; + + Student() { + name = null; + age = 0; + } + Student(Student st) { + name = st.name; + age = st.age; + } +} +``` + +So basically, to make a copy, we need to pass it as a parameter to the copy constructor, as the data type is Student. +```java +Student st1 = new Student(); +st1.name = "Utkarsh"; +st1.age = 27; + +Student st2 = new Student(st1); // Copy Constructor +``` + +So now we understand how to write a copy constructor, but what is the use case of the copy constructor? + +* The copy constructor comes in use when we have an object, and a newly created object needs the same values, so we don't assign it ourselves. We use the copy constructor the get the work done. +* Some of the attributes may be private and cannot be accessed by the user, but a copy constructor can access it and make the copy itself. + +### Question + +Is copy constructor same as doing `Student st2 = st1;`? + +**Choices** + +- [ ] Yes +- [ ] In some cases only +- [x] No + + +Let's see how do things work internally? + + +* So we have a memory, and st1 is present in the memory with all the data, as shown in the above diagram. +* When we write student `st2 = st1`, we just make st2 to point as s1, i.e., **a new object is not created**. +* Now the problem here is if we do changes in st2, i.e. `st2.name = 'xyz'`, it will change the value of st1. + + +Now if we create the object using copy constructor then it has a different address. So it's not pointing in the memory, as we have seen in the example above. + +--- +### Deep and Shallow copy + +### Shallow copy + +* When we have created a new object, but behind the scenes, the new object still refer to attributes of the old object. i.e., the new object still refers to the same data as the old copy. + +```python +original_books = ["Book A", "Book B"] +shallow_copy_books = original_books + +shallow_copy_books.append("Book C") + +print(original_books) # Output: ["Book A", "Book B", "Book C"] +``` + +### Deep copy + +* When we have created a new object behind the scenes, the new object do not refer to attributes of the old object. i.e., the new object has no shared data. + +```python +import copy + +original_books = ["Book A", "Book B"] +deep_copy_books = copy.deepcopy(original_books) + +deep_copy_books.append("Book C") + +print(original_books) # Output: ["Book A", "Book B"] +``` + +--- +### Inheritance + + + +**How is inheritance represented?** +**Ans** - Inheritance is represented as parent-child relations between different classes. + +Now, let's talk about the scaler's hierarchy of representation. + + + +Now, Let's say User has the following attributes: +* Username +* Login + + +So, We can say that: +* Instructor +* Mentor +* TA +* Student + +They all are **specific types** of users i.e. they will share all the members / attributes / methods of **User** and may have some more of their own. + +A **child class / subclass** can have specific attributes / behaviors which may not be present in the **parent class / superclass**. + +>Consider the below diagram for explaining child / subclass & parent / superclass terms more clearly. + + +So we can **conclude**: A child class inherits all the members of the parent class and may or may not add their own members. + +--- + +### Parent-Child Relationship in Code + +How can we represent a parent-child relationship in code? Let's say we need to make a relationship between the User and the Instructor. + + +To build this, Let's say we have a **Parent class called User**, as shown below: +```java +class User { + String userName; + + void login() { + ... + } +} +``` +**Instructor** is a child/subclass of User, so how can we do that? +```java +Class Instructor extends User. +``` +So here `extends` is the **keyword in Java** that is used to create a child class. + +The `extend` keyword is specific to Java and is used to create a subclass that inherits properties and behaviors from a superclass. + +While the keyword itself may vary in other programming languages, the concept is similar. Here are a few examples from different languages: + +- **In Python:** The inheritance is indicated using **parentheses**. +For example: `class Subclass(SuperClass):` + +- **In C++:** The inheritance is specified using a **colon**. +For example: `class Subclass : public SuperClass { };` + +- **In C#:** The inheritance is specified using a **colon**. +For example: `class Subclass : BaseClass { }` + +So, while the specific syntax and keywords may differ, the concept of class extension or inheritance is present in various object-oriented programming languages. + +The instructor class has the following methods: +```java +class Instructor extends User { + String batchName; + double avgRating; + + void scheduleClass() { + ... + } +} +``` + +* Does the Instructor class needs a username property? + * Yes +* Do we need to code it? + * No +* So, how can we use it? + * We are extending it from the User class. + +Extends means, **keeping the original things and adding more things to it**. + +--- +### Constructor Chaining + + +How do we create an object of any class? +```java +Instructor i = new Instructor(); +``` +* Did we ever created `Instructor()` constructor? + * No, Right? + +* So, how it came into the picture? + * Yes, It is a Default Constructor. +This constructor initializes to default values of all the attributes, so can we do like: +```java +i.username = "Utkarsh"; +i.login(); +``` +Yes, because it's coming from the `User` class. + +Can we also do: +```java +i.avgRating = 4 +``` +Yes, because it's part of the Instructor's class. + +**Note:** In Inheritance, a parent class is nothing but generalization, and every child is a specification. + +Now, assume we are given this relation: + + +--- +### Question + +Which of these classes has the highest level of abstraction? + +**Choices** + +- [x] A +- [ ] B +- [ ] C +- [ ] D + + +First of all, what is abstraction? +- It's an idea. + +So, what does the highest level of abstraction mean? +- A bigger idea that means a more general idea. + +So out of them, **A** is the most generic class, right? +That's why **A has the highest level of abstraction.** + +--- +### Question + +Do the child class contains all the attributes of parent class? + +**Choices** + +- [x] Yes +- [ ] No +- [ ] Can't say + + +Definitely, **Yes**. +Example is Animal :arrow_right: Dog + +So now the question is, how are they initialized? Who initializes them? + +Let's see what happens behind the scenes: + +* Let's say we have a User class as shown below: + +And we create a `User` object: + **`User user = new User();`** + +So, +How will the attributes get initialized? +**Ans** - Since we haven't created our constructor, our attributes get assigned to null values by default constructor, as shown below. + * + +* Or we may create our own constructor: + + + +Now, If we create a child class / sub-class named instructor: + + +**Now the question is:** When we create an instructor, someone has to initialize the attribute that came from the parent. + +There are scenarios now: +1. We know how to initialize, and we understand how to change, so **we will initialize** the values to those attributes, like this: + + +But DO YOU THINK we will always Know how to initialize the attributes? +Ans - **No!** But there is someone who'll always know how and what to initialize. + +2. A **constructor of the parent** definitely knows how and what to initialize the attributes. Let's understand How it's done! + +--- +### Steps to Create an Object of Child + +**(Assuiming no constructor is created, its only default constructors are present)** + +Suppose we have a class named **A**. + + +Now `B` is a child of `A`, +`C` is a child of `B`, and +`D` is a child of `C.` + +Suppose we create an object of **D**: +```java +D d = new D(); +``` + +So, **What really happens when we call `D()`?** +1. Constructor of D will be called. +2. Since D is also a child of someone, so before its execution, it will call the constructor of C. +3. Similarly, C will call the constructor of B first. +4. And B will call the constructor of A before it's execution. + +So, **Who's constructor will be finished first?** +- **A**'s constructor will be finished first, then **B** will be finished, then **C** will be finished, then **D** will be finished. + +Because, +* **Can a child be born before its parents are born?** +**No**, right? + * That's why the parent class constructor will be called first. We haven't specifically called the parents constructor but by default, the parent constructor is called. + +**Note:** + + +What will happen if we add a parameterized constructor in class **C** as shown below: +```java +public class C extends B { + C() { + System.out.println("Constructor of C"); + } + C(String a) { + System.out.println("Constructor of C with params"); + } +} +``` +What will be the output if we run the code now? +The output will still be the same right, i.e., `Default Constructor of C` will be printed with all other constructors from A, B & D. + +But, What if we want to **print the manual constructor** of class C? + +To make this happen, we need to make changes in our **D** class. +We have to add the **super** function in the first line of our constructor. + +```java +public class D extends C { + D() { + super ("Hello"); // This must be the first line + System.out.println("Constructor of D"); + } +} +``` +The **super("Hello");** will make the parametrized constructor from Class C become active. + +**Note:** This super() line in the code must be written in the **first line inside a constructor**. Otherwise, it throws an error. + +--- +## Polymorphism + +What really is polymorphism? + +There's a very famous explanation of Polymorphism i.e. **Poly means Many** and **Morphism means Form**. + +Which means, someone who has multiple forms. + +So, till now, in today's class, have you learned about something which had multiple forms? +**Ans** - Yes, a user could have multiple forms. Because a user can be a student, instructor, TA, etc. + +So this can be an example of multiple forms. + +**Another example** - Suppose we have a list of Animals. Animals have Mammals, Reptiles, Aquatic, etc. classifications. + +**Can we write:** +`Animal a = new Dog();` +Yes, because this is an **object of type Dog**, which is a Mammal and which is an Animal. So we can write it! + +**But, Can we write:** +`Dog d = new Animal();` +No, this is **not allowed** since every Dog is an Animal, but every Animal must not be a Dog. + +**That means: We can put an object of the child class in a variable that takes parent data type.** + +**Suppose we have three classes, A, B, and C.** as shown below: + + +Now if we write: +```java +A a = new C(); +a.company = "ABC"; +``` +This will **throw an error** because **a** has a datatype of **A**, but A doesn't have any variable named company. + +* Compiler only allows you access to members of the data type of the variable. + +Now, suppose you have a method called: +**changePassword()** + +* Is this change password method need a Student / TA / Instructor, OR just a user? + * Just a User, right? +Because it doesn't matter which type of user is asking for a changepassword. + +=> **The more generic your code is, the better the reusability will be.** +This is one of the use cases of Polymorphism. + +There are **two types of polymorphism**: +1. Compile Time Polyphormism +2. RunTime Polymorphism + +Now we have seen that one way of having many forms is **Inheritance**. The other is called **Method overloading**. + +--- + +### Method Overloading + + +Suppose we have a class **A**, and it has a method named `hello()`. + +* Can a class have another method with the same name but having different parameters? + * Yes, this second method `hello(String Name)` is having same name. + +Now, this is called **Method overloading**. + +Here also, can you identify **Polymorphism**? +**Ans** - The same method name has many forms. + +So, If we write: +```java +hello(); +hello(name); +``` +Does the compiler knows which method to call? In each of the statements? +* Yes, It knows. So it will be the respective parameters which matches the method definition. + +:arrow_right: As here, the final form that will execute is known to the *Compiler*. That's why it is known as **Compile time Polymorphism**. + +Which of the following is a method overloading, and which of them is not? +* +Yes, the first 2 are method overloading, but the last one is not method overloading. + + +:arrow_right: So there is something called a **Method Signature**. +A method signature is: **`Name of method (Data type of Params)`** + +Example: If we have a method: +`void printHello(String Name, int age)` + +* Method signature for this method will be: + `printHello(String, int)` + +**Methods are known to be overloaded when they have the same name but different signatures.** + +--- +### Question + +Is this allowed in the same class? +``` +void printHello(String s) {...} + +String printHello(String s) {...} +``` + +**Choices** + +- [ ] Yes +- [x] No +- [ ] Can't say + + +Since the method signature of both the functions is same, the compiler will not be able to distinguish between the functions and hence will give **compile time error**. + +--- +### Method overriding + +Suppose we have a class **A**, +```java +Class A { + void doSomething(String a) { + ... + } +} +``` +And we have another class **B** which inherits from **A**, and this class also had a method named `doSometihng`, +```java +Class B extends A { + String doSomething(String c) { + ... + } +} +``` +So, Is this allowed? +**Ans** - No, +Since all the methods of the parent class are present in the child class, like: +```java +Class B extends A { + String doSomething(String c) { + ... + } + // Parent method inherited + void doSomething(String a) { + ... + } +} +``` +And, in the child class, we are having 2 methods with the same signature which it's not allowed. It's going to give us a **Compile time error**. + + +Now let's see another scenario of the same classes. But here, the **return type of both methods is going to be the same**. + +Suppose we have a class **A**, +```java +Class A { + void doSomething(String a) { + ... + } +} +``` +And we have another class **B** which inherits from **A**, and this class also had a method named `doSometihng`, like: +```java +Class B extends A { + void doSomething(String c) { + ... + } +} +``` + +If parent and child classes have the same method with the same name and same return type, and the same signature, this is called **Method overriding.** +In Method overriding, the Parent class methods get hidden. + +Let's say we have two classes, as shown below: + + +And in the **Main()** method we run the following: + +So we can see that at first, we have `Hello` as output, and in the last statement, we get `Bye` as output. + +Now there are some points that you have to understand: + +* The method that is executed is of the data type that is **actually** present at the time of code and **not the type of variable**. +* Do we know the exact code that is about to run in compile time? + * No, and that's why it's called **RunTime polymorphism** + +=> ***Compiler relies on the data type of variable, whereas runtime relies on the actual object.*** diff --git a/Academy DSA Typed Notes/Advanced/DSA Queues Implementation & Problems.md b/Academy DSA Typed Notes/Advanced/DSA Queues Implementation & Problems.md new file mode 100644 index 0000000..c88a699 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Queues Implementation & Problems.md @@ -0,0 +1,500 @@ +# Queues: Implementation & Problems + +--- +## Queue + +A queue represents a linear data structure where items are added at one end and removed from the other end. It follows the "First-In-First-Out" (FIFO) principle, meaning that the item that has been inserted first in queue will be the first one to be removed. To illustrate this concept, let's use a ticket counter as an example. + +**Example: Ticket Counter Queue** + +Imagine you're at a ticket counter for a popular event, and there are several people waiting in line to purchase tickets. This line of people forms a queue, and the first person who has come in this line will get the ticket first. + + + + +Common operations in a queue include: + +1. **Enqueue**:
This operation adds an element to the back (or rear) of the queue. It is also called "push" in some contexts. +2. **Dequeue**:
This operation removes and returns the element from the front of the queue. It is also called "pop" in some contexts. +3. **Peek or Front**:
This operation allows you to look at the element at the front of the queue without removing it. It is useful for inspecting the next item to be processed. +4. **IsEmpty**:
This operation checks if the queue is empty. If it's empty, it means there are no elements in the queue. +5. **Size or Length**:
This operation returns the number of elements currently in the queue. It provides the count of items in the queue. + +**Q. Can a stack or queue have a limit of elements it can have, and then we can use isFull()?** + +**Sol.** Yes, both stacks and queues can have a limit on the number of elements they can hold, and you can use an "isFull()" method to check if they have reached their capacity. This concept is commonly referred to as a "bounded" stack or queue. + + +--- + Implementaion of queue +description: Discussion about the various concepts related to implementaion of queue in detail. +duration: 2100 +card_type: cue_card +--- + +### Implementaion of Queue +Here's how you can implement a queue using a dynamic array along with pseudocode for the `enqueue`, `dequeue`, and `isEmpty` operations: + +```sql +Queue using Dynamic Array: +- Initialize an empty dynamic array (e.g., ArrayList or Python list) to store the elements. +- Initialize two pointers: 'front' and 'rear'. Initially, both are set to -1. + +Pseudocode for Enqueue (Add an element to the rear of the queue): +enqueue(element): + if rear is -1: + # Empty queue, set both front and rear to 0 + set front and rear to 0 + else if rear is at the end of the array: + # Check if there is space for expansion + if front > 0: + # Move elements to the beginning of the array + for i from front to rear: + array[i - front] = array[i] + set rear to (rear - front) + set front to 0 + else: + # If no space, resize the array by creating a new larger array + new_size = current_array_size * 2 # You can choose your resizing strategy + create a new array of size new_size + copy elements from the current array to the new array + set array to new_array + set rear to (rear - front) + set front to 0 + + + array[rear] = element + increment rear by 1 + +Pseudocode for Dequeue (Remove an element from the front of the queue): +dequeue(): + if front is -1: + # Empty queue, nothing to dequeue + return "Queue is empty" + else: + element = array[front] + increment front by 1 + if front > rear: + # Reset front and rear to -1 if the queue is empty + set front and rear to -1 + return element + +Pseudocode for isEmpty (Check if the queue is empty): +isEmpty(): + if front is -1: + return true + else: + return false +``` + +This pseudocode provides a basic implementation of a queue using a dynamic array. It handles the enqueue and dequeue operations efficiently by resizing the array when necessary to accommodate more elements. The `isEmpty` function checks if the queue is empty by examining the state of the `front` pointer. + +### Implementation of Queues using linkedlist + +1. **Insert at Head (prepend):** + - **Time Complexity:** O(1) + - **Explanation:** Inserting a node at the head of a singly linked list involves creating a new node, setting its `next` pointer to the current head, and updating the head pointer to the new node. This operation takes constant time because it doesn't depend on the size of the list. + +2. **Insert at Tail (append):** + - **Time Complexity:** O(n) + - **Explanation:** To insert a node at the tail of a singly linked list, you typically need to traverse the entire list to find the current tail node. This operation takes linear time since you have to visit each node in the list to reach the end. + +3. **Delete at Head:** + - **Time Complexity:** O(1) + - **Explanation:** Deleting a node at the head of a singly linked list is a constant-time operation. You simply update the head pointer to point to the next node in the list. + +4. **Delete at Tail:** + - **Time Complexity:** O(n) + - **Explanation:** Deleting a node at the tail of a singly linked list also requires traversing the entire list to find the current tail node. This operation takes linear time since you have to reach the end of the list to perform the deletion. + + +Queue functionality can be achieved by using two of the methods mentioned: + +1. **Insertion at Head and Deletion at tail:**
This approach can be used to provide the functionality of queue.Elements are inserted at the head (enqueue operation)with TC O(1) and removed from the tail with TC O(n)(dequeue operation). This ensures that the first element added to the queue is the first one to be removed. + +2. **Insertion at Tail and Deletion at Head:**
This approach can also be used to create a queue using LinkedList.Elements are inserted at tail with TC O(n) and removed from the head with TC O(1). We can optimise the TC of insertion at tail to O(1) by maintaining a tail pointer and this is why we generally used this approach for queue creation through LinkedList. + + + +--- +### Question +What will be the state of the queue after these operations + +enqueue(3), enqueue(7), enqueue(12), dqueue(), dqueue(), enqueue(8), enqueue(3) + +**Choices** +- [x] 12, 8, 3 +- [ ] 3, 7, 12, 8 +- [ ] 3, 8, 3 +- [ ] 7, 12, 3 + + +**Explanation** + +Let's break down the sequence of queue operations: + +enqueue(3) : Queue becomes [3] +enqueue(7) : Queue becomes [3, 7] +enqueue(12) : Queue becomes [3, 7, 12] +dequeue() : Removes the element from the front, and the queue becomes [7, 12] +dequeue() : Removes the element from the front, and the queue becomes [12] +enqueue(8) : Queue becomes [12, 8] +enqueue(3) : Queue becomes [12, 8, 3] + +So, after these operations, the final state of the queue is [12, 8, 3] + + +--- +### Question +What will be the state of the queue after these operations + +enqueue(4), dqueue(), enqueue(9), enqueue(3), enqueue(7), enqueue(11), enqueue(20), dqueue() + + +**Choices** +- [ ] 4, 9, 3, 7 +- [x] 3, 7, 11, 20 +- [ ] 9, 3, 7, 11 +- [ ] 3, 7, 20 + + + +**Explanation** +Let's go through the sequence of queue operations: + +enqueue(4): Queue becomes [4] +dequeue(): Removes the element from the front, and the queue becomes empty. +enqueue(9): Queue becomes [9] +enqueue(3): Queue becomes [9, 3] +enqueue(7): Queue becomes [9, 3, 7] +enqueue(11): Queue becomes [9, 3, 7, 11] +enqueue(20): Queue becomes [9, 3, 7, 11, 20] +dequeue(): Removes the element from the front, and the queue becomes [3, 7, 11, 20] + +So, after these operations, the final state of the queue is [3, 7, 11, 20] + + + +--- +### Implementaion of queue using Stack + + +The explaination for implementing a queue using two stacks step by step: + +```cpp +class QueueUsingTwoStacks { +private: + std::stack stack1; // For enqueue operations + std::stack stack2; // For dequeue operations +``` + +We define a C++ class called `QueueUsingTwoStacks`. This class has two private member variables: `stack1` and `stack2`. `stack1` is used for enqueue operations, and `stack2` is used for dequeue operations. + +```cpp +public: + void enqueue(int value) { + // Simply push the value onto stack1 + stack1.push(value); + } +``` + +The `enqueue` method allows you to add an element to the queue. In this implementation, we simply push the given `value` onto `stack1`, which represents the back of the queue. + +```cpp + int dequeue() { + if (stack2.empty()) { + // If stack2 is empty, transfer elements from stack1 to stack2 + while (!stack1.empty()) { + stack2.push(stack1.pop()); + } + } + + // Pop the front element from stack2 (which was originally at the front of stack1) + if (!stack2.empty()) { + int front = stack2.top(); + stack2.pop(); + return front; + } + + // If both stacks are empty, the queue is empty + std::cerr << "Queue is empty" << std::endl; + return -1; // You can choose a different sentinel value or error handling strategy + } +``` + +The `dequeue` method allows you to remove and return the front element from the queue. Here's how it works: + +- If `stack2` is empty (meaning we haven't yet transferred elements from `stack1` to `stack2`), we perform the transfer. We pop elements from `stack1` and push them onto `stack2`, effectively reversing the order of elements. This is done to ensure that the front element is at the top of `stack2`. +- We then pop the top element from `stack2` (which was originally at the front of the queue) and return it. +- If both `stack1` and `stack2` are empty, we print an error message and return a sentinel value (-1 in this case) to indicate that the queue is empty. You can customize the error handling strategy as needed. + +```cpp + bool isEmpty() { + return stack1.empty() && stack2.empty(); + } +}; +``` + +The `isEmpty` method checks whether the queue is empty. It returns `true` if both `stack1` and `stack2` are empty, indicating that there are no elements in the queue. + +In the `main` function, we create an instance of `QueueUsingTwoStacks`, perform enqueue and dequeue operations, and check if the queue is empty. The example code demonstrates the usage of this queue implementation. + + +--- +### Problem 1 Nth perfect number + +Write a function `findNthPerfectNumber(N)` that takes an integer N as input and returns the Nth perfect number formed by the only digits 1 and 2. + +**Input:** +- An integer $N (1 <= N <= 1000)$, representing the position of the desired perfect number. + +**Output:** +- Return the Nth perfect number formed using only digits 1 and 2. + +**Example:** + + + +**Question Explanation** + + + + + +* As we can see in above example, we have to insert 1 and 2 in the queue. +* The next numbers can be made using the previous digits by appending the combination of 1 and 2. +* Like to get 11 we append 1 after 1, to get 12 we append 2 after 1. +* Similarly, we can generate numbers 21 by appending 1 after 2, and to get the 22, we can append 2 to 2 and so on. +* As we have to append and remove digits frequently so queue can help us here. + + +--- +### Question +What is the **5th** perfect number formed by the only digits 1 and 2. + +**Choices** +- [ ] 11111 +- [ ] 22222 +- [x] 21 +- [ ] 12 + + + +**Explanation:** + + + +From the image, the 5th Perfect Number is **21**. + +--- +### Nth perfect number Solution + +#### Solution + +```javascript +int solve(N) { + if (N <= 2) return N + // Queue ->q + q.enqueue(1) q.enqueue(2) + i = 3 + while (i <= N) { + x = q.dequeue() + a = x * 10 + 1 + b = x * 10 + 2 //a + 1 + if (i == N) return a + if (i + 1 == N) return b + q.enqueue(a) + q.enqueue(b) + i = i + 2 + } +} +``` + +#### Dry Run + +To dry run the provided code for N = 10, we'll create a table to keep track of the values of `q` (the queue) and `i` at each step. + +```plaintext +| N | q | i | | +|:---:|:----:| --- |:-----------------:| +| 10 | 1, 2 | 3 | // Initial values | + +// Loop starts +| N | q | i | +|-------|----------------|-----| +| 10 | 2, 11, 12 | 3 |// Dequeue 1, enqueue 11 and 12 +| 10 | 11, 12,21,22 | 5 |// Dequeue 2, enqueue 21 and 22 +| 10 |12,21,22,111,112| 7 |// Dequeue 11, enqueue 111 and 112 +| 10 |21,22,111,112,121,122| 9 |// Dequeue 12, enqueue 121 and 122 + +// Now Loop ends at N == 10 , and ans = 122 + +``` + +The function dequeues and enqueues values in the queue until `i` reaches `N`. When `i` equals `N`, it returns the current value of `a`. In this case, for `N = 10`, the function returns 112. + + +#### Complexity +**Time Complexity:** O(n) +**Space Complexity:** O(n) + +--- +### Doubly Ended Queue + + +A double-ended queue (deque) is a data structure that allows elements to be added or removed from both ends, making it versatile for various operations. A double-linked list is a common choice for implementing a deque because it provides efficient operations for adding and removing elements from both ends. + +Here are some basic operations that are possible with a doubly-ended queue implemented using a double-linked list: + +1. **Insertion at Front (push_front)**: Add an element to the front (head) of the deque. +2. **Insertion at Back (push_back)**: Add an element to the back (tail) of the deque. +3. **Removal from Front (pop_front)**: Remove and return the element from the front of the deque. +4. **Removal from Back (pop_back)**: Remove and return the element from the back of the deque. +5. **Front Element Access (front)**: Get the element at the front of the deque without removing it. +6. **Back Element Access (back)**: Get the element at the back of the deque without removing it. + +A **double-linked list** is well-suited for implementing a **deque** because it allows for efficient insertions and removals at both ends. Each node in the linked list has pointers to the next and previous nodes, making it easy to manipulate the list in both directions. + + +--- +### Problem 2 Sliding Window Maximum +#### Problem Statement + +Given an integer array `A` and an window of size k find the max element. + +**Input** + +- An integer array `A` and integer `k` . + +**Output** + +- An integer representing the maximum length of a subarray of `A` in which the average of all elements is greater than or equal to `k`. If no such subarray exists, return 0. + +**Example** + + + +#### Question Explanation +Find max elements in 4-element sliding windows of array A: +- `[1, 8, 5, 6]` -> max: 8 +- `[8, 5, 6, 7]` -> max: 8 +- `[5, 6, 7, 4]` -> max: 7 +- `[6, 7, 4, 2]` -> max: 7 +- `[7, 4, 2, 0]` -> max: 7 +- `[4, 2, 0, 3]` -> max: 4 +Result: `[8, 8, 7, 7, 7, 4]`. + +1. Initialize an empty list `max_elements`. +2. Iterate from index 0 to 3 (inclusive) to create windows of size 4. +3. Find the maximum element in each window and append it to `max_elements`. +4. Result: `[8, 8, 7, 7, 7, 4]`, representing max elements in each 4-element window in `A`. + +--- +### Question +Given an integer array `A` and an window of size k find the max element. + +A = [1, 4, 3, 2, 5] +k = 3 + +**Choices** +- [x] [4, 4, 5] +- [ ] [5, 5, 5] +- [ ] [1, 4, 3] +- [ ] [5, 4, 3] + + +**Explanation:** + +Maximum of [1, 4, 3] is 4 +Maximum of [4, 3, 2] is 4 +Maximum of [3, 2, 5] is 5 + +So, `[4, 4, 5]` is the answer. + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Sliding Window Maximum Approaches + +#### Brute Force Approach + +Brute-force approach to find max element in a window of size `k` in array `A` involves iterating through windows, finding max within each, and storing results. Time complexity: **O(n * k)** and space complexity: **O(1)**. + +#### Dry Run using the Sliding Window Approach + +Array `A = [1, 8, 5, 6, 7, 4, 2, 0, 3]` and `k = 4`. + + + +Let's dry run the code with the given example: + +Array `A = [1, 8, 5, 6, 7, 4, 2, 0, 3]` and `k = 4`. + +1. Initialize an empty queue `q`. +2. Start iterating through the array elements. + - **For i = 0, A[i] = 1:** + - Queue `q` is empty, so nothing happens. + - Enqueue `i` at the rear of the queue. `q = [0]`. + - **For i = 1, A[i] = 8:** + - The front element of the queue is at index `0`, which is smaller than the current element and thus can't be the maximum for any window. + - Deque the element and Enqueue `i` at the rear of the queue. `q = [1]`. + + - **For i = 2, A[i] = 5:** + - `q` is not empty, and `A[r]` (element at index `1`) is greater than `A[i]`, so we don't do anything. + - Enqueue `i` at the rear of the queue. `q = [2]`. + + - **For i = 3, A[i] = 6:** + - `q` is not empty, and `A[r]` (element at index `2`) is smaller than `A[i]`, so we deque it, now 8 is greater than 6 so don't do anything. + - Enqueue `i` at the rear of the queue. `q = [3]`. + + **After the first K insertions, the q = [8,6]; +Now the maximum of this window is present in the front so print it and slide the window. +To slide the window, check if A[i - k] is present in front, if yes then dequeue it. Add the next element to slide the window** + + - Continue this process for the remaining elements. + +3. The final output will be the maximum elements in each group of size `k`: + + - For `k = 4`, the maximum elements are `[8, 8, 7, 7, 4, 2, 3]`. + +So, the dry run demonstrates how the code finds and prints the maximum elements in groups of size `k` as it iterates through the array. + +#### Pseudocode (Using Dequeue) + +```javascript +function findMaximumInGroups(A, k): + Initialize an empty queue q + n = length(A) // Total number of elements in the array A + + for i from 0 to k - 1: + while (!q.isEmpty() and A[i] >= A[q.rear()]): + q.dequeueRear() // Remove elements that are smaller than A[i] + q.enqueueRear(i) // Add the current element to the queue + + print A[q.front()] // Print the maximum element in the current group + + // Slide for next windows + + for i from k to n - 1: + if (!q.isEmpty() and q.front() == i - k): + q.dequeueFront() // Remove elements that are outside the current window + + while (!q.isEmpty() and A[i] >= A[q.rear()]): + q.dequeueRear() // Remove elements that are smaller than A[i] + q.enqueueRear(i) // Add the current element to the queue + + print A[q.front()] // Print the maximum element in the last group + +# Example usage: +A = [1, 8, 5, 6, 7, 4, 2, 0, 3] +k = 4 +findMaximumInGroups(A, k) + +``` + +#### Complexity +**Time Complexity:** O(n) +**Space Complexity:** O(n) diff --git a/Academy DSA Typed Notes/Advanced/DSA Recursion 1.md b/Academy DSA Typed Notes/Advanced/DSA Recursion 1.md new file mode 100644 index 0000000..ab20916 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Recursion 1.md @@ -0,0 +1,374 @@ +# Recursion 1 + +--- +## Introduction to Recursion + +### Definition +1. See this video - [LINK](https://www.youtube.com/watch?v=-xMYvVr9fd4) +2. Function calling itself. +3. A problem is broke into smaller problem(subproblem) and the solution is generated using the subproblems. + + +**Example** +Here's an example of how recursion can be used to calculate the sum of the first **N** natural numbers: +```cpp +sum(N) = 1 + 2 + 3 + 4 + ..... + N-1 + N +sum(N) = sum(N-1) + N +``` +Here, **sum(N-1)** is smaller instance of same problem that is **sum(N)**. +sum(N-1) is known as a subproblem. + +### How to write a recursive code? +We can solve any recursive problem using below magic steps: + +1. **Assumptions:** Decide what the function does for the given problem. +2. **Main logic:** Break the problem down into smaller subproblems to solve the assumption. +3. **Base case:** Identify the inputs for which we need to stop the recursion. + +--- +## Function Call Tracing + +* Function call tracing involves tracing the sequence of function calls that are made when a program is executed. +* It involves keeping track of the function calls, their arguments, and the return values in order to understand the flow of the program and how the functions are interacting with each other. + +### Example: +We have the following code: +```cpp +int add(int x, int y) { + return x + y; +} + +int mul(int x, int y, int z) { + return x * y * z; +} + +int sub(int x, int y) { + return x - y; +} + +void(int x) { + cout << x << endl; +} + +int main() { + int x = 10; + int y = 20; + print(sub(mul(add(x, y), 30), 75)); + return 0; +} +``` +Here are the steps involved in function call tracing of the above code: + +“” + +* We start with the call to **sub(mul(add(10, 20), 30), 75)**. +* That called: **mul(add(10, 20), 30)**. +* That called: **add(10, 20)**. +* add will return **10+20 = 30** to **mul** function. +* mul will return **30*30 = 900** to **sub** function. +* sub will return **900-75 = 825** to print function. + +### Data structure involved in function calls +* We need to store calling function so that we can come back to it once answer of the called function has been evaluated. +* **Stack Data Structure** is used to store function calls, their arguments, and return values. +* In recursion, stack is called "call stack" and is used by the program to keep track of function calls in progress. +“” + +--- +### Problem 1 : Factorial of N +Given a positive integer N, find the factorial of N. + +### Question +If N = 5, find the factorial of N. + +**Choices** +- [ ] 100 +- [x] 120 +- [ ] 150 +- [ ] 125 + +**Solution** + +**Assumptions:** Create a function which - +* takes an integer value `N` as parameter. +* calculates and returns N!. +* return type should be integer. + +**Main logic:** +* The factorial of N is equal to N times the factorial of (N-1) +* We made assumption that sum(N) calculates and return factorial of N natural number. Similarly, sum(N-1) shall calculate and return the factorial of N-1 natural number. +`factorial(N) = N * factorial(N-1)` + +**Base case:** The base case is when N equals 0, i.e., `0! = 1` + +For example, +When we perform, `factorial(N) = N * factorial(N-1)`, value of N keeps on decreasing by 1. +`N -> (N-1) -> (N-2) ........ 2 -> 1` +for N = 1 as well as 0, the factorial is 1. +So, we can write base case for N = 0 which will also cover for N = 1. + +#### Pseudocode +```cpp +int factorial(int N) { + // base case + if (N == 0) { + return 1; + } + // recursive case + return N * factorial(N - 1); +} +``` + +### Dry Run + + + + +--- +### Problem 2 : Nth number in the Fibonacci Series + +The Fibonacci sequence is a series of numbers in which each number is the sum of the two preceding numbers. + + +The sequence goes like this: +| N | 0 | 1 | 2 | 3 | 4 | 5 |....| +|---|---|---|---|---|---|---|---| +| Fibonacci(N) | 0 | 1 | 1 | 2 | 3 | 5 |....| + + +Given a positive integer N, write a function to compute the Nth number in the Fibonacci sequence using recursion. + +**Example** +```cpp +Input = 6 +Output = 8 +``` +**Explanation:** +| N | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +|---|---|---|---|---|---|---|---| +| Fibonacci(N) | 0 | 1 | 1 | 2 | 3 | 5 | 8 | + +Fibonacci(6) = Fibonacci(5) + Fibonacci(4) = 3 + 5 = 8. + +--- +### Question +If N = 7, find the Nth number in the fibonacci sequence. + +**Choices** +- [ ] 8 +- [ ] 5 +- [x] 13 +- [ ] 10 + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Nth number in the Fibonacci sequence Solution +#### Solution +**Assumptions:** Create a function which - +* takes an integer value `N` as parameter. +* calculates and returns Nth number in the fibonacci sequence. +* return type should be integer. + +**Main logic:** Recursively compute the (N-1)th and (N-2)th numbers in the sequence and add them together to get the nth number. +`fibonacci(N) = fibonacci(N - 1) + fibonacci(N - 2)` + +**Base case:** If N is 0 or 1, return the corresponding value in the Fibonacci sequence. + +* Since, according to the definition of fibonacci sequence, the smallest two possible values of N are `N = 1` & `N = 2`, therefore, stop recursion as soon as N becomes 0 or 1. + +#### Pseudocode +```cpp +int fibonacci(int N) { + // base case + if (N == 0 || N == 1) { + return N; + } + + // recursive case + return fibonacci(N - 1) + fibonacci(N - 2); +} + +``` +#### Function Call Tracing +“” + + + +--- +### Time Complexity of Recursion - using Recurrence Relation + +**Factorial(N)** +#### Pseudocode +```cpp +int factorial(int N) { + // base case + if (N == 0) { + return 1; + } + // recursive case + return N * factorial(N - 1); +} +``` + +* Let's assume that time taken to calculate **factorial(n)** = **T(n)**. +* **factorial(n)** depends on the time taken by **factorial(n-1)** and other than that, constant work is being performed. +* Time taken by **factorial(n-1) = T(n-1) + O(1)**. +* Therefore, for the sum of digits, the recursive relation will be defined as follows: + +#### Equation 1 +``` +T(n) = T(n-1) + 1 +``` +**1** is added because other than function calls, a constant amount of work is being done. + +Substituting the value of ```T(n-1) = T(n-2) + 1``` + +#### Equation 2 +``` +T(n) = T(n-2) + 2 +``` +Substituting the value of ```T(n-2) = T(n-3) + 1``` + +#### Equation 3 +``` +T(n) = T(n-3) + 3 +``` +Substituting the value of ```T(n-3) = T(n-4) + 1``` +#### Equation 4 +``` +T(n) = T(n-4) + 4 +``` + +After say **k** iterations, we shall reach to the base step. +The equation will be: +#### Equation 5 +``` +T(n) = T(n-k) + k +``` + +The base case shall take constant time: + +``` +T(0) = O(1) +``` + +We shall substitute the value of **n - k = 0** + +``` +=> n - k = 0 +=> n = k +``` +Put the above value in a generalized equation, we get +``` +T(n) = T(0) + n +T(n) = 1 + n +T(n) = O(n) +``` +Hence we can say that. +``` +T(n) = O(n) +``` +--- +### Time Complexity of Fibonacci + +#### Pseudocode +```cpp +Function fibonacci(int n) { + if (n == 0 || n == 1) return n; + return fibonacci(n - 1) + fibonacci(n - 2); +} +``` +Recurrence Relation is: +``` + T(n) = T(n-1) + T(n-2) +``` +For easy calculation, we can write the recurrence relation as follows: +``` + T(n) = 2 * T(n-1) +``` +It will evaluate to **O(2N)** +>Note to Instructor: Please evaluate above recurrence relation in class. + + +### Another definition of Time Complexity + +Time Complexity can also be defined as + +**Time taken in a single function call * Number of function calls** + +--- +### Question +How many recursive calls in the factorial(6)? + +Choose the correct answer +**Choices** +- [ ] 0 +- [ ] 2 +- [x] 6 +- [ ] 10 + +--- +### Space Complexity of Recursive Code + + +The space complexity of recursion refers to the amount of memory required by a recursive algorithm as it executes. It is determined by the maximum amount of memory needed on the call stack at any given point during the recursion. + +### Space Complexity of factorial(N) +Total N call will be stored in the stack. +``` +factorial(1) +factorial(2) +--------------- +--------------- +--------------- +factorial(N-1) +factorial(N) +``` + +Maximum stack space used is N, hence space is O(N) + +Hence, total O(N) space is required to execute all the recursive calls. + +### Space complexity of fibonacci(n) +If the time complexity of our recursive Fibonacci is O(2^n), what’s the space complexity? + +***Tempted to say the same?*** +> NOTE to Instructor: Show it using a stack + +**SPACE COMPLEXITY** can also be calculated using **RECURSIVE TREE** + + + +>Please Note: This tree is known as Recursive Tree. + +Space complexity is the amount of memory used by the algorithm. + +When a function is called, it is added to the stack. + +When a function returns, it is popped off the stack. + +We’re not adding all of the function calls to the stack at once. + +We only make n calls at any given time as we move up and down branches. + +We proceed branch by branch, making our function calls until our base case is met, then we return and make our calls down to the next branch. + + + +We can also define **Space Complexity** as **height of the Recursive Tree**. + +--- +### Question +What is the height of tree for fibonacci(6) ? +Choose the correct answer + +**Choices** +- [ ] 0 +- [ ] 7 +- [x] 6 +- [ ] 8 + diff --git a/Academy DSA Typed Notes/Advanced/DSA Recursion 2.md b/Academy DSA Typed Notes/Advanced/DSA Recursion 2.md new file mode 100644 index 0000000..4bf0555 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Recursion 2.md @@ -0,0 +1,547 @@ +# Recursion 2 + +## Question +What is the output of the following code for N = 3? +```cpp +void solve(int N){ + if(N == 0) + return; + solve(N-1); + print(N); +} +``` + +**Choices** + +- [x] 1 2 3 +- [ ] 0 1 2 +- [ ] 2 1 0 +- [ ] 3 2 1 + + + + +```cpp +void solve(int N) { + if (N == 0) + return; + solve(N - 1); + print(N); +} +``` +N=3 + +1. So first of all, solve(3) is called, +1. Then solve(3) will first call for solve(2) as n!=0, +1. Similarly, solve(2) calls for solve(1), and then solve(1) calls for solve(0). + + + + +Now n==0 so return. + +Then solve(1) will print 1, then it will return, and after that solve(2) will print 2, in this way 1, 2, 3 will be printed as an output. + + + + +--- +### Question +What is the output of the following code for N = 3? +```cpp +void solve(int N){ + if(N == 0) + return; + print(N); + solve(N-1); +} +``` + +**Choices** + +- [ ] 1 2 3 + +- [ ] 0 1 2 + +- [ ] 2 1 0 + +- [x] 3 2 1 + + + +```cpp +void solve(int N){ + if(N == 0) + return; + print(N); + solve(N-1); +} +``` +N=3 + +1. So first of all, solve(3) is called, +1. Then solve(3) will first **print 3**, then call for solve(2) as n!=0, +1. In this way solve(2) first **print 2**, then call for solve(1), and then solve(1) will **print 1**, then call for solve(0). + + + + +Now n==0 so return. + +Then solve(1) will return, after that solve(2) will return. +In this way 3, 2, 1 will be printed as an output. + + + + +--- +### Question +What is the output of the following code for N = -3? +```cpp +void solve(int N){ + if(N == 0) + return; + print(N); + solve(N-1); +} +``` + +**Choices** + +- [ ] -3 -2 -1 + +- [ ] 3 2 1 + +- [x] Error; Stack Overflow + +- [ ] 1 2 3 + + + +```cpp +void solve(int N){ + if(N == 0) + return; + print(N); + solve(N-1); +} +``` +`N = -3` + + +In this question we will never reach 0, that's why we are getting stack overflow. +At first solve(-3) is called, then it will print -3 +call for solve(-4), then it will print -4 +call for solve(-5), in this way, it will keep making calls infinitely, as we will not reach zero, hence stack overflow error occurs. + +--- +## Problem 1 Power Function +**Problem Statement** + +Given two integers **a** and **n**, find **an** using recursion. + +**Input** +``` +a = 2 +n = 3 +``` +**Output** +``` +8 +``` +**Explanation** +23 i.e, 2 * 2 * 2 = 8. + +:::warning +Please take some time to think about the recursive approach on your own before reading further..... +::: + +#### Brute Force Approach +The above problem can be redefined as: +``` +a ^ n = a * a * a......* a (n times). +``` +The problem can be broken into subproblem as: +``` +a ^ n = a ^ (n-1) * a +``` +So we can say that pow(a,n) is equivalent to +``` +pow(a,n) = pow(a,n-1) * a +``` +Here, pow(a,n) is the defined as `a^n`. +We have seen how the problem is broken into subproblems. Hence, it can be solved using recursion. +Below is the algorithm: +* Assumption step: + * Define a recursive function pow(a,n). +* Main Logic: + * Define a recursive case: if **n** > 0, then calculate the pow(a,n-1). + * Return a * pow(a,n-1). +* Base Case: + * Base condition: if **n** = 0, then return 1. + +#### Pseudocode +```cpp +function pow(int a, int n) { + if (n == 0) return 1; + return a * pow(a, n - 1); +} +``` + +#### Complexity +We shall calculate Time Complexity at the end. + +--- +### Power Function Optimized Approach 1 +We can also divide pow(a, n) as follows: +if **n** is even: +``` +pow(a,n) = pow(a,n/2) * pow(a,n/2) +``` +if **n** is odd: +``` +pow(a,n) = pow(a,n/2) * pow(a,n/2) * a +``` +#### Recursion Steps: +* Assumption Step: + * Define a recursive function pow(a,n). +* Main Logic: + * if n is odd, then return pow(a,n/2) * pow(a,n/2) * a. + * else return pow(a,n/2) * p(a,n/2). +* Base Condition: + * if **n** is equal to 0, then return 1. + +#### Pseudocode +```cpp +Function pow(int a, int n) { + if (n == 0) return 1; + + if (n % 2 == 0) { + return pow(a, n / 2) * pow(a, n / 2); + } else { + return pow(a, n / 2) * pow(a, n / 2) * a; + } +} +``` +The above function will have more time complexity due to calling the same function twice. We will see it while calculating Time Compleixity. + +--- +### Time Complexity of Power Function + +#### Pseudocode +```cpp +Function pow(int a, int n) { + if (n == 0) return 1; + + if (n % 2 == 0) { + return pow(a, n / 2) * pow(a, n / 2); + } else { + return pow(a, n / 2) * pow(a, n / 2) * a; + } +} +``` + +Let Time taken to calculate pow(a,n) = f(n). +``` +T(n) = 2 * T(n/2) + 1 +``` + +Substituting the value of T(n/2) = 2 * T(n/4) + 1 +``` +T(n) = 2 * [2 * T(n/4) + 1] + 1 + = 4 * T(n/4) + 3 + = 2^2 * T(n/2^2) + (2^2 - 1) +``` + +Substituting the value of T(n/4) = 2 * T(n/8) + 1 +``` +T(n) = 4 * [2 * T(n/8) + 1] + 3 + = 8 * T(n/8) + 7 + = 2^3 * T(n/2^3) + (2^3 - 1) +``` +Substituting the value of T(n/8) = 2 * T(n/16) + 1 +``` +T(n) = 8 * [ 2 * T(n/16) + 1] + 7 + = 16 * T(n/16) + 15 + = 2^4 * T(n/2^4) + (2^4 - 1) +``` +After, say, **k** iterations, we shall reach the base step. +The equation will be: +``` +T(n) = 2^k * T(n/2^k) + (2^k - 1) +``` +The base case shall take contant time: + +``` +T(0) = O(1) or T(1) will also be constant +``` + +``` +n/(2 ^ k) = 1 +n = 2^k +k = log2(n) +``` +Hence we can say that +``` +T(n) = n * T(1) + (n - 1) + = O(n) +``` + +Let's see time complexity of the optimised pow function. + + +--- +### Power Function Optimized Approach - Fast Power + +In above approach, we are calling function **pow(a, n/2)** twice. Rather, we can just call it once and use the result twice. +Below is the algorithm: +* Assumption Step: + * Define a recursive function **pow(a,n)**. +* Main Logic: + * Calculate **pow(a,n/2)** and store it in a variable **p**. + * if n is odd, then return **p * p * a**. + * else return **p * p**. +* Base Condition: + * if **n = 0**, then return **1**. + +#### Pseudocode +```cpp +Function pow(int a, int n) { + if (n == 0) return 1; + + int p = pow(a, n / 2); + + if (n % 2 == 0) { + return p * p; + } else { + return p * p * a; + } +} +``` +> Note: The above function is known as Fast Power or Fast Exponentiation. + +--- +### Time Complexity of Fast Power + +#### Pseudocode +```cpp +Function pow(int a, int n) { + if (n == 0) return 1; + + long p = pow(a, n / 2); + + if (n % 2 == 0) { + return p * p; + } else { + return p * p * a; + } +} +``` +Let time taken to calculate pow(a,n) = f(n). +Recurrence Relation is: +``` +T(n) = T(n/2) + 1 +``` + +Substituting the value of T(n/2) = T(n/4) + 1 +``` +T(n) = [T(n/4) + 1] + 1 + = T(n/4) + 2 +``` + +Substituting the value of T(n/4) = T(n/8) + 1 +``` +T(n) = [T(n/8) + 1] + 2 + = T(n/8) + 3 +``` +Substituting the value of T(n/8) = T(n/16) + 1 +``` +T(n) = [T(n/16) + 1] + 3 + = T(n/16) + 4 +``` +After say **k** iterations, we shall reach to the base step. +The equation will be: +``` +T(n) = T(n/2^k) + k +``` +Base case shall take constant time: + +``` +T(0) = O(1) or T(1) will also be constant +``` + +``` +n/(2 ^ k) = 1 +n = 2^k +k = log2(n) +``` +Hence we can say that +``` +T(n) = T(1) + log2(n) + = O(log2(n)) +``` + +--- +### Question +How many recursive call in the FAST pow(2,5)? + +Choose the correct answer + +**Choices** +- [ ] 0 +- [ ] 2 +- [x] 4 +- [ ] 5 + + + +This is ~ log N calls. +Therefore, time complexity of sum of digits = O(log N) * 1 = O(log N) + + +--- +### Space Complexity of pow(a,n) + +There are total **log2(N)** recursive calls as shown below: +``` +pow(a,0) +pow(a,1) +pow(a,2) +pow(a,4) +--------------- +--------------- +--------------- +sumofdigits(a,N/2) +sumofdigits(a,N) +``` +Hence, the total O(log2(N)) space required to execute all the recursive calls. + +--- +### Problem 2 Tower of Hanoi +There are n disks placed on tower A of different sizes. + +**Goal** +Move all disks from tower A to C using tower B if needed. + +**Constraint** +- Only 1 disk can be moved at a time. +- Larger disk can not be placed on a small disk at any step. + +Print the movement of disks from A to C in minimum steps. + +**Example 1** + +**Input:** N = 1 + + + + +**Explanation:** + + +**Output:** +1: A -> C + + +**Example 2** +**Input:** N = 2 + + +**Explanation:** +1: A -> B + + +2: A -> C + + + +1: B -> C + + +**Output:** +1: A -> B +2: A -> C +1: B -> C + +**Example 3** +**Input:** N = 3 + + +**Explanation:** +1: A -> C +2: A -> B +1: C -> B + + + +3: A -> C + + +1: B -> A +2: B -> C +1: A -> C + + + +**Output:** +1: A -> C +2: A -> B +1: C -> B +3: A -> C +1: B -> A +2: B -> C +1: A -> C + +#### n disks + + + +**Step 1:** +Move (n-1) disks from A to B + + +**Step 2:** +Move n disk to C + + +**Step 3:** +Move (n-1) disks from B to C + + + +#### Pseudocode +```cpp + src temp dest +void TOH(int n, A, B, C){ + 1. if(n == 0) + return; + 2. TOH(n - 1, A, C, B); // move n-1 disks A->B + 3. print(n : A -> C); // moving n disk A->C + 4. TOH(n - 1, B, A, C); // move n-1 disks B->C +} +``` + +#### Dry Run +**n = 3** + + + + +**Output:** +1: A -> C +2: A -> B +1: C -> B +3: A -> C +1: B -> A +2: B -> C +1: A -> C + +#### Time Complexity +It can be observed in terms of number of steps taken for N + + + +#### Space Complexity + + + diff --git a/Academy DSA Typed Notes/Advanced/DSA Searching 1 Binary Search on Array.md b/Academy DSA Typed Notes/Advanced/DSA Searching 1 Binary Search on Array.md new file mode 100644 index 0000000..e3887c9 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Searching 1 Binary Search on Array.md @@ -0,0 +1,488 @@ +# Searching 1: Binary Search on Array + +--- + + +### Introduction to Searching - Story + +* Let us say you lost something +* When you go to the police, you tell them what to search for—the target—and where to search—the search space. +* It is easy to look for a word in the dictionary as compared to searching for a word in a book or newspaper. This is because along with the target element, we also have defined search space(alphabetical order). +* In the Phone book as well, we have names sorted in the contacts list, so it's easier to find a person's number. +* **Search space** - The area where we know the result exists and we search there only +* **Target** - The item we are looking for +* **Condition** - Some condition to discard some part of the search space repeatedly to make it smaller and finally reach the result. +* **Binary Search** - divide the search space into two parts and repeatedly keep on neglecting one-half of the search space. + +--- +### Question + +In binary search, at each step, the search range is typically: + +**Choices** +- [x] Halved +- [ ] Tripled +- [ ] Doubled +- [ ] Reduced by one + +--- +## Binary Search + + +### Binary Search Question +Given a sorted array with distinct elements, search the index of an element **k**, if k is not present return -1. +arr[] = + +| 3 | 6 | 9 | 12 | 14 | 19 | 20 | 23 | 25 | 27 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +#### Brute Force Approach - Linear Search +* We can traverse the array and compare each element with the target element. This is done until we find the target element or all the elements of the array are compared. This method is called linear search and the time complexity in the worst case is **O(N)** where **N** is the number of elements in the array. +* We can perform the same operation with less number of comparisons and with better time complexity using Binary Search as the array is sorted. +#### Binary Search Approach +* Binary search has three elements, + * **Search space -** array + * **target -** we are given a target element to be found from the array + * **condition ->** + * array is sorted, say I am at some random position, if I compare the current element with the target element. + * If `current_element > target_element`, I can discard all the element appearing before current element and the target_element as they will always be smaller than current element. + * Similarly, if the `current_element < target_element`, the target element and the elements appearing after it can be discareded. + * We have all the three elements and thus, binary search can be easily applied to it. +* Let us take the middle index. +* if `arr[mid] == k`, i.e. we found the target, we return the index of the target. +* if `arr[mid] < k` i.e. the target exists on the right side of the array so the left half is of no use and we can move to the right. +* Similarly, if `arr[mid] > k` i.e. the target exists on the left, and the right half can be discarded. + + + +#### Dry Run + +Let us dry run binary search for the array: + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |8 | 9 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 3 | 6 | 9 | 12 | 14 | 19 | 20 | 23 | 25 | 27 | + +**First Iteration:** +* low = 0, high = 9 +* +* arr[4] (14) > target (12) (Since 14 already is larger and array is sorted, so all the elements to the right of mid will be even larger, hence, we should move left.) +* go left -> high = mid - 1 = 3 + +**Second Iteration:** +* low = 0, high = 3 +* the mid = +* arr[1] (6) < target (12) +* go right -> left = mid + 1 = 2 + +**Third Iteration:** +* low = 2, high = 3 +* the mid = +* arr[2] (9) < target (12) +* go right -> left = mid + 1 = 3 + +**Fourth Iteration:** +* low = high = 3 = mid +* arr[3] (12) == target (12) +* break; + + + +* Dry run for target element not present, let's say **11**. + + + +#### Binary Search Pseudo Code +```javascript +int search(int arr[], int N, int k) { + lo = 0, hi = N - 1; + while (lo <= hi) { + mid = lo + (hi + lo) / 2; + if (arr[mid] == k) { + return mid; + } else if (arr[mid] < k) { + lo = mid + 1; + } else { + hi = mid - 1; + } + } + return -1; +} +``` + +#### Complexity +**Time Complexity:** O(log N) +**Space Complexity:** O(1) + + +--- +### Question + +If the element 'k' is found in a sorted array, what will be the time complexity of binary search? + +**Choices** +- [ ] O(1) +- [x] O(log n) +- [ ] O(n) +- [ ] O(n^2) + +--- +### Best Practices - Binary Search + + +* Some write the formula of mid calculation as but it is incorrect, as in some cases it may lead to overflow. +* e.g, Let us assume that maximum number stored by a particular data type is `100` (It's Integer.Max_Int but just to make maths easy, assuming its 100), and the number of elements in the array is `100` for which last index will be `99` for zero indexing and thus, is in the limit. +* There is the posibility that the target element is at the position `98` and value of `low = 98` and `high = 99`. When we calculate `mid` for this scenario, the `high` and the `low` are in limits but while calculating the mid first the sum `197` will be calculated and stored. This will cause the overflow as the limit of the variable is `100` only(assumption). +* This may result in incorrect or negative value. +* Whereas, when we write we will get which even in the worst case be `99` and will not overflow. + + + + +--- +### Identify 2024's First Email + + +All emails in your mailbox are sorted chronologically. Can you find the first mail that you received in 2024? + +--- +### Binary Search Problems - Find first occurrence + +Given a sorted array of N elements, find the first occurrence of the target element. +arr[] = +| -5 | -5 | -3 | 0 | 0 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 8 | 10 | 10 | 15 | 15 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | + +For `5` first occurence is at index `7` so we have to return `7`. +* Brute force approach is linear search. +* Now the array is sorted so using binary search we can find at least one of the occurences of the given target element. +* The challenge is to **find the first occurence**. What we know about the first occurence is that it is always going to be the current position or in the left. +* Now in left, we can do linear search but in worst it will take about O(N) time complexity. +* What we have got is the potential answer, it can or cannot be final anser. +* We can store the current position in a variable, in case it is the first occurence. Next, we can apply binary search in the left side of the array. +* The only change we are required to make is to not stop if we find the target element instead keep looking in the left side of the array until `low > high`. +* If the `mid == target` store mid, go left. +* else if `mid > target` go right. +* else go left. + + + + + + +#### Dry run for the example + + + + + + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -5 | -5 | -3 | 0 | 0 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 8 | 10 | 10 | 15 | 15 | + +**First Iteration:** +* low = 0, high = 18 +* the mid = +* arr[9] (5) == target (5) +* ans = 9 +* go left -> high = mid - 1 = 8 + +**Second Iteration:** +* low = 0, high = 8 +* the mid = +* arr[4] (0) < target (5) +* go right -> left = mid + 1 = 5 + +**Third Iteration:** +* low = 5, high = 8 +* the mid = +* arr[6] (1) < target (5) +* go right -> left = mid + 1 = 7 + +**Fourth Iteration:** +* low = 7, high = 8 +* the mid = +* arr[7] (5) == target (5) +* go left -> high = mid - 1 = 6 +* break; + +--- +### Question + +When searching for the first occurrence of an element in a sorted array, what should you do if the current element matches the target 'k'? + +**Choices** +- [ ] Return the current index +- [ ] Continue searching in the right subarray +- [x] Continue searching in the left subarray +- [ ] Stop searching immediately + + +--- +### Question + +What is the time complexity of finding the first occurrence of an element in a sorted array using binary search? + +**Choices** +- [x] O(log n) +- [ ] O(n) +- [ ] O(1) +- [ ] O(n^2) + + +--- +#### Complexity +**Time Complexity:** O(logn) (Everytime you are discarding the search space by half). +**Space Complexity:** O(1) + +#### Follow up question +* Try for the last occurence + + + +--- +### Find the unique element + +**Question** +Every element occurs twice except for 1, find the unique element. +**Note:** Duplicate elements are adjacent to each other but the array is not sorted. + +**Example:** + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Brute Force Approach +* The brute force approach can be comparing A[i] with A[i+1]. If `(A[i]!=A[i+1])`, then `A[i]` is the unique element. + +#### Optimal Approach +* Can we apply Binary Search ? + * Say we land at mid, how to know current element is the answer? => We can check element at its right and at its left. If both are different, then `mid` is the ans. + * If `A[mid]` is not the answer, then how to decide in which direction shall we move? + * For that, let's make some observation. + * We are given that only one element is unique, there are two occurences of remaining elements. + * **`Can you make some observation w.r.t first occurrences of elements before and after unique element ?`** + * Before unique element, first occurrences are at even index. After unique element, all first appear at odd indices. + +**Let us say the array is as follows:** + +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 +| -------- | -------- | -------- | -------- | -------- | -------- | ------- | -------- | -------- | -------- | -------- | +7|7|6|6|3|8|8|1|1|9|9| + +* 3 is unique. +* First occurrence of 7 and 6 is at index even and after 3, first occurrences of elements, 8, 1, 9 is at odd index. + +#### Steps for applying Binary Search +* Land at mid, if `A[mid] != A[mid-1] && A[mid] != A[mid+1]`, then `A[mid]` is the answer. +* NOTE: To avoid accessing invalid indices, above conditions shall be modified as follows- + * `mid == 0 || A[mid] != A[mid-1]` + * `mid == N-1 || A[mid] != A[mid+1]` +* Else, we will check index of first occurrence of the element we landed on. + * If index is even, then unique element must be present on right. + * Else, on left. + +#### Dry Run for An Example + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Elements | 3 | 3 | 1 | 1 | 8 | 8 | 10 | 10 | 19 | 6 | 6 | 2 | 2 | 4 | 4 | + +For the above array, +**1st Iteration:** +* `low = 0, high = 14`, +* $mid = 0 + (14-0)/2 = 7$ +* It's not unique. +* `arr[mid] == arr[mid - 1]` -> `mid - 1` is the first occurence. +* `mid - 1 = 6` which is even -> go to right +* `low = mid + 1` + +**2nd iteration:** +* `low = 8, high = 14` +* $mid = 8 + (14-8)/2 = 11$ +* It's not unique. +* `mid - 1 = 10` +* `arr[mid] != arr[mid - 1]` +* `mid + 1 = 12` +* `arr[mid] == arr[mid + 1]` -> mid is the first occurence. +* `mid % 2 != 0` i.e. mid is odd and thus, left subarray has the unique element. We will move high to `mid - 1 = 10`. + +**3rd iteration:** +* `low = 8, high = 10` +* $mid = 8 + (10-8)/2 = 9$ +* Its not unique. +* `mid - 1 = 8` +* `arr[mid] != arr[mid - 1]` +* `mid + 1 = 10` +* `arr[mid] == arr[mid + 1]` -> mid is the first occurence. +* `mid % 2 != 0` i.e. mid is odd and thus, left subarray has the unique element. We will move high to `mid - 1 = 8`. + +**4th iteration:** +* `low = 8, high = 8` +* `mid = (8 + (8 - 8) / 2) = 8` +* `mid - 1 = 7` +* `arr[mid] != arr[mid - 1]` +* `mid + 1 = 9` +* `arr[mid] != arr[mid + 1]` -> mid is the **unique element.** We will terminate the loop. + + +#### Pseudo Code +```cpp +int findUnique(int arr[], int N) { + + lo = 0, hi = N - 1; + + // binary search + while (lo <= hi) { + mid = lo + (hi - lo) / 2; + + if ((mid == 0 || arr[mid] != arr[mid - 1]) && (mid == N - 1 || arr[mid] != arr[mid + 1])) { //checking mid is unique + return A[mid]; + } else if (mid == 0 || arr[mid] == arr[mid - 1]) { //at first occurrence + if (mid % 2 == 0) lo = mid + 2; + else hi = mid - 1; + } else { //at second occurrence + if (mid % 2 == 0) hi = mid - 2; + else lo = mid + 1; + } + } +} +``` + +#### Complexities + +**Time Complexity:** O(log(N) +**Space Complexity:** O(1) + +--- +### Increasing Decreasing Array + +Given an increasing decreasing array with distinct elements. Find max element. + +**Examples** + +arr[] = {1, 3, 5, 2} +In the above array `5` is the max value. +arr[] = {1, 3, 5, 10, 15, 12, 6} +In the given example max element is `15` + +The increasing decreasing array will look something like this: + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Solution +* Increasing decreasing arrays are the array that increases first and after reaching its peek it starts decreasing. We are supposed to find the peek or the max element of the array. The increasing side is sorted in ascending order and the decreasing side is sorted in descending order. +* Brute force approach is a linear search with O(N) time complexity. +* But as we see the elements are sorted in increasing and then decreasing order, so can we do better than O(N) time complexity? +* Can we apply **Binary Search**? What do we need ? + * **Search space** -> array + * **target** -> peak element + * **Condition:** -> + * **Case 1**: if`(arr[mid] > arr[mid - 1] && arr[mid] < arr[mid + 1])` return mid; + * If immediate left and right are less than current element than we are at peek element. + + * **Case 2**: if`(arr[mid] > arr[mid - 1] and arr[mid] < arr[mid + 1])` go right; + * Implies our mid is at the part of the array where it is still increasing. So the peek will be at the right side of the array. + + * **Case 3**: go left + * This infers that mid is at the decreasing side of the array and peek must be at left. + + +#### Pseudocode + + + + +--- +### Local Minima in an Array + +Given an array of N distinct elements, find any local minima in the array + +**Local Minima** - a no. which is smaller than its adjacent neighbors. + +**Examples** + + + + + +* A = {**3**,6,1,**0**,9,15,**8**} + * Here, we have 3 local minima, `3`, `0`, and `8`. + * `3 < 6`, `0 < 1 && 0 < 9`, and `8 < 15`. All these are smaller than their left and right neighbours. + +* B = {21,20,19,17,15,9,**7**} + * All the numbers are in decreasing order, so we only have one local minima `7`. +* C = {**5**,9,15,16,20,21} + * Similarly, all the numbers are strictly increasing so `5` is the only local minima in this example. +* D = {**5**,8,12,**3**} + * Here, the series first increases and then decreases. So we have two local minima `5` and `3`. `5 < 8` and `3 < 12`. +* This can have multiple local minima +* We have to return any local minima + +#### Solution +* **Case 1:** Current element is smaller than the next and the previous element returns the current element, since this is local minima. +* **Case 2:** If the current element is greater than the previous element and less than the next element. + + + +* Here we are not looking for global minimia, we are looking for local minima. If `arr[mid - 1] < arr[mid] < arr[m + 1]` there are two posiblities, either `arr[m - 1]` is one of the local minima or we will definitely find a local minima in left direction as elements to the left are in decreasing order. +* **Case 3:** If the current element is greater than the next element and is smaller than the previous element go to the right. As Left may or may not have local minima but the right will definitely have local minima. +* **Case 4:** The current element is greater than the previous as well next element. Then we can go to either the left or to the right, because both will contain atleast one local minima. + + +#### Pseudo Code +```javascript +int localMinima(int[] A) { + l = 0, h = n - 1; + while (l <= h) { + mid = l + (h - l) / 2; + if ((mid == 0 || arr[mid] < arr[mid - 1]) && (mid == N - 1 || arr[mid] < arr[mid + 1])) { + return mid; + } else if (mid == 0 || arr[mid] < arr[mid - 1]) { + l = mid + 1; + } else { + h = mid - 1; + } + } +} +``` + +#### Dry run + + + + + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +| ------- | ---- | --- | --- | --- | --- | --- | --- | ---- | +| Element | 9 | 8 | 2 |7 |6 |4 |1 | 5 | + +**1st Iteration** +* `low = 0, high = 7` +* `mid = 3` +* The element to the left of mid -> `2 < 7` Thus, `7` cannot be local minima. +* The array is increasing and thus, one of the local minima must be in the left of the array, so we will change `high = mid - 1 = 2`. + +**2nd iteration** +* `low = 0, high = 2` +* `mid = 1` +* Element to the left of mid -> `9 > 8` +* Element to the right of mid -> `2 < 8` +* `8` cannot be local minima. As `2` is smaller than `8`, we are at decreasing array and thus, the local minima must exist in the right. +* `low = mid + 1` + +**3rd iteration** +* `low = 2, high = 2` +* `mid = 2` +* Element to the left of mid -> `2 < 8` +* Element to the right of mid -> `2 < 7` +* **2 is our local minima.** + +#### Complexities +* **Time Complexity: O(log(N))** +* **Space Complexity: O(1)** \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Searching 2 Binary Search Problems.md b/Academy DSA Typed Notes/Advanced/DSA Searching 2 Binary Search Problems.md new file mode 100644 index 0000000..71b3183 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Searching 2 Binary Search Problems.md @@ -0,0 +1,569 @@ +# Searching 2: Binary Search Problems + +--- +## Understanding Binary Search + +### Introduction: +We will continue with our second lecture on Binary Search. In our previous session, we explored the fundamental concepts of this efficient searching algorithm. Today, we will dive even deeper into the world of binary search, uncovering advanced techniques and applications that expand its capabilities. + +In this lecture, we will build upon the foundation laid in the first session. We'll delve into topics such as binary search on rotated arrays, finding square root using binary search etc and addressing various edge cases and challenges that may arise during binary search implementation. + +### Pseudocode +```java +function binarySearch(array, target): + left = 0 + right = length(array) - 1 + + while left <= right: + mid = left + (right - left) / 2 + + if array[mid] == target: + return mid + else if array[mid] < target: + left = mid + 1 + else: + right = mid - 1 + + return NOT_FOUND +``` + +### Use Cases: +Binary search has numerous applications, including: +* Searching in databases. +* Finding an element in a sorted array. +* Finding an insertion point for a new element in a sorted array. +* Implementing features like autocomplete in search engines. + +--- +### Question +In what scenario does Binary Search become ineffective? + +**Choices** +- [x] When the dataset is unsorted. +- [ ] When the dataset is extremely large. +- [ ] When the dataset is sorted in descending order. +- [ ] When the dataset contains only unique elements. + + +--- +### Problem 1 Searching in Rotated Sorted Arrays + +### Introduction: +We'll explore the fascinating problem of searching in rotated sorted arrays using the Binary Search algorithm. This scenario arises when a previously sorted array has been rotated at an unknown pivot point. We'll discuss how to adapt the Binary Search technique to efficiently find a target element in such arrays. + +### Scenario: +Imagine you have an array that was sorted initially, but someone rotated it at an unknown index. The resulting array is a rotated sorted array. The challenge is to find a specific element in this rotated array without reverting to linear search. + +### Example: Finding an Element in a Rotated Array + +Suppose we have the following rotated sorted array: +```javascript +Original Sorted Rotated Array: [4, 5, 6, 7, 8, 9, 1, 2, 3] +``` +Let's say we want to find the element 7 within this rotated array using a brute-force approach (Linear Search). + +### Brute-Force Approach: + +* Initialize a variable target with the value we want to find (e.g., 7). +* Loop through each element in the array one by one, starting from the first element. +* Compare the current element with the target: +* If the current element matches the target, we have found our element, and we can return its index. +* If the current element does not match the target, continue to the next element. +* Repeat step 3 until we either find the target or reach the end of the array without finding it. + +### Adapting Binary Search: +While the array is rotated, we can still leverage the divide-and-conquer nature of Binary Search. However, we need to make a few adjustments to handle the rotation. + +**Intution:** +* In a rotated sorted array, elements were initially sorted in ascending order but have been rotated at some point. +* Let's asusme array contain distinct elements only. +* The goal is to find a specific target element within this rotated array. +* The key to binary search in a rotated array is to determine the pivot point, which is where the array rotation occurred. +* The pivot point is essentially the maximum element in the array. +* Once you've identified the pivot point, you have split the array into two subarrays, each of which is sorted. +* Then you can apply individual binary search in both the parts, and find the target element. +* **Another Idea of Doing it in one Binary Search we'll discuss below** +* **Partitioning of Rotated Sorted Array:** + * A rotated sorted array can be visualized as being split into two parts: part 1 and part 2. + * Crucially, both part 1 and part 2 are sorted individually, but every element in part 1 is greater than those in part 2 due to the rotation. + + +* **Identifying Target's Part** + * To determine which part the Target belongs to (part 1 or 2), compare it with the 0th element. + * If the midpoint is greater than (also equals to) the 0th element, then it belongs to part 1. Otherwise, it's in part 2. + + + +* **Identifying Midpoint's Part:** + + * To determine which part the midpoint belongs to (part 1 or 2), compare it with the 0th element. + * If the midpoint is greater than (also equals to) the 0th element, then it belongs to part 1. Otherwise, it's in part 2. +* **Midpoint vs Target:** + * If the midpoint is the equals to the target, you've found it. + * If not, then check if the target lies in the same part as the midpoint. If yes, both target and midpoint is within the same sorted part, perform a binary search in that part to move your midpoint towards the target. + + + * If no, move your search towards the other part, effectively approaching the midpoint towards target. + + +* **Iterative Process:** + * Continue adjusting your boundaries based on the decisions made in the previous step until you either find the target or exhaust your search space. +* **Result:** + * Return the index of the target if found, or -1 if not. + +**Algorithm:** +* Initialize left to 0 and right to len(nums) - 1. +* While left is less than or equal to right, do the following: +* Calculate the middle index mid as left + (right - left)/2. +* If nums[mid] is equal to the target, return mid as the index of the target. +* Check if the target is less than nums[0] (indicating it's on part 2): +* If target < nums[0], check if nums[mid] is greater than or equal to nums[0]: +* If true, update left to mid + 1 to search the right half. +* If false, update right to mid - 1 based on target's relation to nums[mid]. +* If the target is greater than or equal to nums[0] (indicating it's on the left side of the pivot): +* If target >= nums[0], check if nums[mid] is less than nums[0]: +* If true, update right to mid - 1 to search the left half. +* If false, update left to mid + 1 based on target's relation to nums[mid]. +* Repeat steps 2-6 until left is less than or equal to right. +* If the loop exits without finding the target, return -1 to indicate the target is not in the array. + +### Example: + +**Scenario:** +Consider the rotated sorted array **[4, 5, 6, 7, 0, 1, 2]** and our target is 0. + +**Solution:** +* Using the provided algorithm: +* Initialize left to 0 and right to 6. +* Calculate mid as (left + right) // 2, which is 3. +* Check if nums[mid] (element at index 3) is equal to the target (0). It's not equal. +* Check if target (0) is less than nums[0] (4). It's not. +* Check if nums[mid] (7) is greater than or equal to nums[0] (4). It's true. +* Update left to mid + 1, making left equal to 4. +* Calculate mid as (left + right) // 2, which is 5. +* Check if nums[mid] (element at index 5) is equal to the target (0). It is equal. +* Return mid, which is 5. + + **We found the target 0 at index 5.** + +--- +### Searching in Rotated Sorted Arrays Pseudocode + +#### Pseudocode: + +```cpp +function searchRotatedArray(nums, target): + left = 0 + right = length(nums) - 1 + + while left <= right: + mid = left + (right - left) / 2 + + if nums[mid] == target: + return mid + + if target < nums[0]: + if nums[mid] >= nums[0]: + left = mid + 1 + else: + if nums[mid] < target: + left = mid + 1 + else: + right = mid - 1 + else: + if nums[mid] < nums[0]: + right = mid - 1 + else: + if nums[mid] < target: + left = mid + 1 + else: + right = mid - 1 + + return -1 +``` + +#### Complexity Analysis: +The time complexity of this modified Binary Search algorithm is still O(log n), making it efficient even in rotated sorted arrays. +**Reason**: +* **Divide and Conquer:**
The algorithm works by repeatedly dividing the search space in half. In each step, it either eliminates half of the remaining elements or finds the target element. This is a characteristic of binary search, which has a time complexity of O(log N). +* **Comparison Operations:**
The main operations within each iteration are comparisons of the target element with the middle element. Since we're dividing the array in half with each comparison, we need at most O(log N) comparisons to find the element or determine that it's not present. +* **No Need to Examine All Elements:**
Unlike linear search, which would require examining all N elements in the worst case, binary search significantly reduces the number of elements that need to be considered, leading to a logarithmic time complexity. + +--- +### Question +In the problem of searching for a target element in a rotated sorted array, what advantage does Binary Search offer over Linear Search? + + +**Choices** +- [ ] Binary Search doesn't require any comparisons. +- [ ] Binary Search works faster on unsorted arrays. +- [x] Binary Search divides the search space in half with each step. +- [ ] Binary Search is always faster than Linear Search. + + + +**Explanation:** +Binary Search offers a significant advantage over Linear Search when searching in a rotated sorted array. With each step, Binary Search efficiently narrows down the search interval by dividing it in half, greatly reducing the number of elements under consideration. This characteristic leads to a time complexity of O(log n), making Binary Search much faster compared to Linear Search's O(n) time complexity, especially for larger arrays. + + +--- +### Problem 2 Finding the square root of a number + + +### Introduction: +Now, we'll explore a fascinating application of Binary Search: finding the square root of a number. The square root operation is a fundamental mathematical operation, and we'll see how Binary Search helps us approximate this value with great efficiency. + +### Motivation: +Imagine you're working on a mathematical problem or a scientific simulation that requires the square root of a number. Calculating square roots manually can be time-consuming, and a reliable and fast method is needed. Binary Search provides an elegant way to approximate square roots efficiently. + +### Brute-Force Algorithm to Find the Square Root: + +* **Input Validation:** If it's negative, return "Undefined" because the square root of a negative number is undefined. +* **Special Cases:** If x is 0 or 1, return x because the square root of 0 or 1 is the number itself. +* **Initialize Guess:** Start with an initial guess of 1. +* Check if the square of the current guess is less than or equal to x. If it is, continue to the next step. If not, exit the loop. +* **Increment Guess:** Increment the guess by 1. +* **Exit Loop:** When the loop exits, it means guess * guess exceeds x. The square root is approximated as guess - 1 because guess at this point is the smallest integer greater than or equal to the square root of x. +* Return Result: Return guess - 1 as the square root of x. + +```cpp +function sqrt_with_floor(x): + if x < 0: + return "Undefined" // Square root of a negative number is undefined + + if x == 0 or x == 1: + return x // Square root of 0 or 1 is the number itself + + // Start from 1 and increment until the square is greater than x + guess = 1 + while guess * guess <= x: + guess = guess + 1 + + // Since the loop ends when guess^2 > x, the floor(sqrt(x)) is guess - 1 + return guess - 1 +``` + +:::warning +Please take some time to think about the Binary Search approach on your own before reading further..... +::: + +### Binary Search Principle for Square Root: +The Binary Search algorithm can be adapted to find the square root of a number by treating the square root as a search problem. The key idea is to search for a number within a certain range that, when squared, is closest to the target value. We'll repeatedly narrow down this range until we achieve a satisfactory approximation. +Establish a search range: The square root of a non-negative number is always within the range of 0 to the number itself. So, you set up an initial search range as [0, x], where 'x' is the number for which you want to find the square root. + +**Intution**: +* **Binary search:** You then start a binary search within this range. The midpoint of the range is calculated, and you compute the square of this midpoint. +* **Comparison:** You compare the square of the midpoint to the original number (x). Three cases can arise: + * **Exact Match:** If the square of the midpoint is exactly equal to x, you've found a value very close to the square root. + * **Square Less Than x:** If the squared midpoint is less than x, it suggests that midpoint can be the answer but we can get the more closer value towards right only(if present). So, adjust the search range to be [midpoint+1, right end of current range]. + * **Square Greater Than x:** If the squared midpoint is greater than x, it indicates the square root lies to the left of the midpoint. Consequently, adjust the search range to be [left end of current range, midpoint-1]. +* **Convergence:** You repeat the binary search by calculating new midpoints and comparing the squares until you converge on an approximation that is sufficiently close to the actual square root. + +For example: + + + +### Example: Finding Square Root using Binary Search + +**Scenario:** +We want to find the square root of the number 9 using Binary Search. + +**Solution:** +* Initialize left = 1 and right = 9 (since the square root of 9 won't be greater than 9). +* Calculate mid = (left + right) / 2 = 5. +* Compare 5 * 5 with 9. +* Since 25 is greater than 9, narrow the search to the left half. +* Update right = 4. +* Calculate mid = (left + right) / 2 = 2. +* Compare 2 * 2 with 9. +* Since 4 is less than 9, adjust the range to the right half. +* Update left = 3. +* Calculate mid = (left + right) / 2 = 3. +* Compare 3 * 3 with 9. +* We found an exact match! The square root of 9 is 3. + +--- +### Finding the square root of a number Pseudocode +#### Pseudocode: +Here's a simple pseudocode representation of finding the square root using Binary Search: + +```cpp +function findSquareRoot(target): + if target == 0 or target == 1: + return target + + left = 1 + right = target + result = 0 + + while left <= right: + mid = left + (right - left) / 2 + + if mid * mid == target: + return mid + else if mid * mid < target: + left = mid + 1 + result = mid + else: + right = mid - 1 + + return result +``` + + +### Analysis and Complexity: + +In each step of the Binary Search, we compare the square of the middle element with the target value. Depending on the result of this comparison, we adjust the search range. Since Binary Search divides the range in half with each step, the time complexity of this algorithm is O(log n), where n is the value of the target number. + +### Use Cases: +Finding the square root using Binary Search has applications in various fields, such as mathematics, engineering, physics, and computer graphics. It's often used when precise square root calculations are required, especially in scenarios where hardware or library-based square root functions are not available. + +--- +### Question + +What advantage does using Binary Search for finding the square root of a number offer over directly calculating the square root? + + +**Choices** +- [ ] Binary Search has a lower time complexity. +- [x] Binary Search provides a more precise result. +- [ ] Binary Search doesn't require any comparisons. +- [ ] Binary Search can find the square root of any number. + + +--- +### Problem 3 Finding the Ath magical number +In this problem, we are tasked with finding the a-th magical number that satisfies a specific condition. A magical number, in the context of this problem, is defined as a positive integer that is divisible by either b or c (or both). +* Magical Number Definition: A magical number is a positive integer that is divisible by either b or c or both. In other words, if a number x is a magical number, it means that x % b == 0 or x % c == 0, or both conditions hold. +* Task: Our task is to find and return the a-th magical number based on the conditions mentioned above. + +#### Example + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Brute force +```cpp +Function findAMagicalNumberBruteForce(a, b, c): + number = 1 // Start with the first positive integer + count = 0 // Initialize the count of magical numbers found + + while count < a: + if number is divisible by b or c: + count = count + 1 // Increment the count if it's divisible by either b or c + number = number + 1 + + return number - 1 // Subtract 1 because we increased 'number' after finding the a-th magical number +``` + +#### Observation + +Answer has to be a multiple of either B or C. So, we know we will get answer till A * B or A * C depending on which is smaller. Therefore, our answer range will be between`[1 to A * min(B,C)]` + +Example: +A = 8 +B = 2 +C = 3 + +A * B = 16 +A * C = 24 +So, our answer will be within range [1 to 16] + +**Que: How many multiples of B, C will be within range [1 to x]?** => x/B + x/C - x/LCM(B,C)$ + +`The LCM of 'b' and 'c' represents the smallest common multiple of 'b' and 'c' such that any number that is divisible by both 'b' and 'c' will be a multiple of their LCM and we will have to subtract it` + +Example: +A = 5 +B = 3 +C = 4 +Range => [1 to 15] +Multiples +=> 15/3 + 15/4 - 15/LCM(3,4) +=> 5 + 3 + 1 = 7 `[3, 4, 6, 8, 9, 12, 15]` + +**Que: How to calculate LCM(B,C) ?** +LCM(B,C) = (B * C) / GCD(B,C) [We know how to calculate GCD!] + + +### Can we apply Binary Search ? + +**Search Space** => `[1 to A * min(B,C)]` +**Target** => Ath Magical Number +**Condition** => +* Say we land at mid. +* To check mid is magical, we need to know how many magical numbers are there in the range [1, mid]. +* Compare with A: If the count is more than A, it means we need to search in the lower range [low, mid-1]. +* Otherwise, if count is < A, we need to search in higher range +* If count == A, then we store mid as answer, and go left. + + + +#### Pseudocode: +```cpp +int count(x, B, C) { + return x/B + x/C - x/LCM(B,C); +} + +int magical(A, B, C) { + l = 1, h = A * min(B,C) + while(l <= h) { + m = l + (h-l)/2; + if(count(m,B,C) > A) { + h = m-1; + } + else if(count(m,B,C) < A) { + l = m+1; + } + else { + ans = m; + h = m-1; + } + } + return ans; +} +``` + +--- +### Question +What is the time complexity of the binary search approach for finding the a-th magical number in terms of A, B, and C? + +**Choices** + +- [ ] O(A) +- [x] O(log A) +- [ ] O(A * B * C) +- [ ] O(log(A * B * C)) + +--- +### Problem 4 Finding median of array + +**What is Median?** +The median of an array is the middle element of the array when it is sorted. For arrays with an odd number of elements, the median is the value at the exact center. For arrays with an even number of elements, the median is typically defined as the average of the two middle elements. It's a measure of central tendency and divides the data into two equal halves when sorted. + +### Brute-Force Algorithm to Find the Median of an Array: + +* Sort the given array in ascending order. You can use any sorting algorithm (e.g., bubble sort, insertion sort, quicksort, or mergesort). +* Calculate the length of the sorted array, denoted as n. +* If n is odd, return the middle element of the sorted array as the median (e.g., sorted_array[n // 2]). +* If n is even, calculate the average of the two middle elements and return it as the median (e.g., (sorted_array[n // 2 - 1] + sorted_array[n // 2]) / 2). + +```cpp +def find_median_brute_force(arr): + # Step 1: Sort the array + sorted_array = sorted(arr) + + # Step 2: Calculate the length of the sorted array + n = len(sorted_array) + + # Step 3: Find the median + if n % 2 == 1: + median = sorted_array[n // 2] + else: + median = (sorted_array[n // 2 - 1] + sorted_array[n // 2]) / 2.0 + + return median +``` + +:::warning +Please take some time to think about the Binary Search approach on your own before reading further..... +::: + +### Binary Search Approach: +The Binary Search technique can be harnessed to find the median of two sorted arrays by partitioning the arrays in such a way that the elements on the left side are less than or equal to the elements on the right side. The median will be either the middle element in a combined array (for an odd number of total elements) or the average of two middle elements (for an even number of elements). + +### Example: Finding Median of Two Sorted Arrays + +**Scenario**: +Consider the two sorted arrays: nums1 = [1, 3, 5] and nums2 = [2, 4, 6]. We want to find the median of the combined array. + +**Intuition:** + +* **Combined Sorted Array:** To find the median of two sorted arrays, you can think of combining them into a single sorted array. The median of this combined array will be our solution. +* **Partitioning:** The key idea is to partition both arrays into two parts such that: + * The elements on the left side are smaller than or equal to the elements on the right side. + * The partitioning should be done in such a way that we can calculate the median easily. + + + +* **Binary Search:** To achieve this, we can perform a binary search on the smaller array (in this case, nums1). We calculate a partition point in nums1, and then we can calculate the corresponding partition point in nums2. + + + +* **Median Calculation:** Once we have the partitions, we can calculate the maximum element on the left side (max_left) and the minimum element on the right side (min_right) in both arrays. The median will be the average of max_left and min_right. + + +* **Handling Even and Odd Lengths:** Depending on whether the total length of the combined array is even or odd, the median calculation varies. If it's even, we average the two values; if it's odd, we take the middle value. + +**Solution**: +* We start by calculating the total length of the combined arrays to determine if the median will be even or odd. +* Then, we use binary search on the smaller array (nums1) to find a partition point that satisfies the conditions mentioned earlier. This ensures that elements on the left are smaller or equal to elements on the right. +* We calculate max_left and min_right for both arrays based on the partitions. +* Finally, we calculate the median as the average of max_left and min_right. + +**Binary Search:** + +* Initialize left = 0 and right = len(nums1) = 3. +* Iteration 1: +* Calculate partition_nums1 = $(0 + 3) / 2 = 1$. +* Calculate partition_nums2 = $(6 + 1) / 2 - 1 = 2$. +* Calculate max_left_nums1 = 1 and max_left_nums2 = 2. +* Calculate min_right_nums1 = 3 and min_right_nums2 = 4. +* Since 1 <= 4 and 2 <= 3, we have found the correct partition. +* Since the total length is even (6), the median is the average of the maximum of left elements and the minimum of right elements, which is $(2 + 3) / 2 = 2.5$. + +--- + +#### Pseudocode: +Here's a simplified pseudocode representation of finding the median of two sorted arrays using Binary Search: + + +```cpp +function findMedianSortedArrays(nums1, nums2): + if len(nums1) > len(nums2): + nums1, nums2 = nums2, nums1 + + total_length = len(nums1) + len(nums2) + left = 0 + right = len(nums1) + + while left <= right: + partition_nums1 = (left + right) / 2 + partition_nums2 = (total_length + 1) / 2 - partition_nums1 + + max_left_nums1 = float('-inf') if partition_nums1 == 0 else nums1[partition_nums1 - 1] + max_left_nums2 = float('-inf') if partition_nums2 == 0 else nums2[partition_nums2 - 1] + + min_right_nums1 = float('inf') if partition_nums1 == len(nums1) else nums1[partition_nums1] + min_right_nums2 = float('inf') if partition_nums2 == len(nums2) else nums2[partition_nums2] + + if max_left_nums1 <= min_right_nums2 and max_left_nums2 <= min_right_nums1: + if total_length % 2 == 0: + return (max(max_left_nums1, max_left_nums2) + min(min_right_nums1, min_right_nums2)) / 2 + else: + return max(max_left_nums1, max_left_nums2) + elif max_left_nums1 > min_right_nums2: + right = partition_nums1 - 1 + else: + left = partition_nums1 + 1 +``` +#### Analysis: +In each iteration, the algorithm adjusts the partition positions based on the comparison of maximum elements on the left side with minimum elements on the right side of the partitions. The Binary Search nature of this algorithm leads to a time complexity of O(log(min(m, n))), where m and n are the lengths of the two input arrays. + +#### Use Cases: +The concept of finding the median of two sorted arrays is crucial in various fields, including data analysis, algorithms, and statistics. + + +--- +### Observations + +* **Sorted Arrays:** Binary Search excels in sorted arrays, capitalizing on their inherent order to quickly locate elements. +* **Search Space:** Identify the range within which the solution exists, which guides setting up the initial search range. +* **Midpoint Element:** The middle element provides insights into the properties of elements in different subranges, aiding decisions in adjusting the search range. +* **Stopping Condition:** Define conditions under which the search should stop, whether an element is found or the search range becomes empty. +* **Divide and Conquer:** Binary Search employs a "divide and conquer" strategy, progressively reducing the problem size. +* **Boundary Handling:** Pay special attention to handling boundary conditions, avoiding index out-of-bounds errors. +* **Precision & Approximations:** Binary Search can yield approximate solutions by adjusting the search criteria. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Searching 3 Binary Search on Answer.md b/Academy DSA Typed Notes/Advanced/DSA Searching 3 Binary Search on Answer.md new file mode 100644 index 0000000..fa33107 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Searching 3 Binary Search on Answer.md @@ -0,0 +1,441 @@ +# Searching 3: Binary Search on Answer + +--- +## Problem 1 Painter's Partition + +We have to paint all N boards of length [C0, C1, C2, C3 … CN - 1]. There are K painters available and each of them takes 1 units of time to paint 1 unit of the board. + +Calculate and return the minimum time required to get the job done. +> NOTE: +> 1. Two painters cannot share a board to paint. That is to say, a board cannot be painted partially by one painter, and partially by another. +> 2. A painter will only paint contiguous boards. This means a painter paints a continous subarray of boards + +**Example 1** +Below are some of the possible configurations: + + +Configuration 1: Max is 31 +Configuration 2: Max is 26 +Configuration 3: Max is 25 + +**Out of above least is 25**, hence configuration 3 is better. We want to minimize the maximum value. + +There can be more configurations, but you'll find the 3rd to be the best, hence **`25`** is the answer. + +**Example 2** +```cpp +A = [10,20,30,40] +K = 2 +``` +P1 => red +P2 => green + +Max = 70 + + + +Max = 60 + +**Output** +60 + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Painter's Partition Greedy Approach + +* Greedy Approach:- We can just divide the total time by total number of painters. +* One might think it as by dividing the boards among the painters would result in least time per painter +* But is this idea valid ? + +### Flaw: +```cpp +A = [1,2,3,4,100] K = 2 +``` +According to Idea 1 :- $110/2 = 55$ + +But we see that it is impossible, because we can't divide the boards among two painters with 55 length each. + +--- +### Question +What is the minimum time to get the job done? + +A = [1,2,3,4,100] K = 2 + +**Choices** +- [ ] 55 +- [x] 100 +- [ ] 1 +- [ ] 110 + + +**Explanation:** +The minimum time required to Finish the job is 100. + +The configuration of the boards is as follows + +* painter1 = [1, 2, 3, 4] = 10 +* painter2 = [100] = 100 + +Thus the maximum of (10, 100) is the minimum time taken to complete the job. + +Among all possible configuration **100** is the minimum time achieved. + + +--- +### Painter's Partition Binary Search + + +Lets's look at example below :- + +`[3, 5, 1, 7, 8, 2, 5, 3, 10, 1, 4, 7, 5, 4, 6]` ans `K = 4` + +Color code for each painter: +> P1 -> Red +> P2 -> Green +> P3 -> Blue +> P4 -> Orange + +--- +#### Search Space +**Best Case** +Say we have as many painters as the number of boards, in which case each painter can paint one board. The maximum value will be the answer. +**Example:** +`A[ ] = {2, 5, 3, 8}, K = 4` +`Then 8 is the answer.` + +**Worst Case** +There is ony 1 painter. In this case, sum(array) is the answer. + +So, our Search Space will be within range: **[max(array) to sum(array)]** + +--- +#### Target +The max time to complete the task + +--- +#### Condition + +* Say we land at mid. How can we decide whether mid is the answer? +* We can check if we can complete the task within mid amount of time at max. + * If yes, then we should save it as the answer and move left to try for a lesser time. + * Else, move right(it means we will need more time to complete the task ) + +--- +### Painter's Partition Dry Run and Pseudocode + + +`[3, 5, 1, 7, 8, 2, 5, 3, 10, 1, 4, 7, 5, 4, 6]` ans `K = 4` + +* Intially the **Lo = 10** and **Hi = 71** (By using above defined criteria for search space) therefore using the above algorithm Mid = $10 + (71 - 10)/2 = 40$ then we check if it is possible to paint all boards in atleast 40 units below is the configuration that satisfy the condition :- + * Painter P1 takes = $3 + 5 + 1 + 7 + 8 + 2 + 5 + 3 = 34$ + * Painter P2 takes = $10 + 1 + 4 + 7 + 5 + 4 + 6 = 37$ + * + * Since the condition is satisfied let's go to left i.e. $Hi = mid -1 = 40 - 1 = 39$ + +* Now **Hi = 39** and **Lo = 10**; Mid = $10 + (39 - 10)/2 = 24$ + * Painter P1 takes = $3 + 5 + 1 + 7 + 8 = 24$ + * Painter P2 takes = $2 + 5 + 3 + 10 + 1 = 21$ + * Painter P3 takes = $4 + 7 + 5 + 4 = 20$ + * Painter P4 takes = 6 + * + * Since the condition is satisfied let's go to left i.e. $Hi = mid -1 = 24 - 1 = 23$ + +* Now Hi = 23 and Lo = 10 therefore using the above algorithm Mid = $10 + (23 - 10)/2 = 16$ then we check if it is possible to paint all boards in atleast 10 units We find that there is no configuration that satisfy the condition therefore we go to right. + +* Similarly we follow the algorithm to arrive at the solution. + + + +#### Pseudocode +```cpp + +// Find minimum painters required for given maximum length (Length that painter can paint) +paintersNumber(arr[], N, mid, K) { + res = 0, numPainters = 1; + + for (i = 0; i < N; i++) { + res += arr[i]; + + if (res > mid) { + res = arr[i]; + numPainters++; + } + } + //if we have used less than or equal to given number of painters, + //then the configurations works + if (numPainters <= K) return true; + else return false; +} + +partition(arr[], N, K) { + Lo = maxEle(arr, N); + Hi = sumArr(arr, N); + + while (Lo <= Hi) { + mid = Lo + (Hi - Lo) / 2; + + if (paintersNumber(arr, N, mid, K)) + ans = mid + Hi = mid - 1; + else + Lo = mid + 1; + } + return ans; +} +``` + +#### Complexities + +**Time Complexity:** O(log (sum - max) * N ) +**Space Complexity:** O(1) + + +--- +### Question +What is the time complexity of the Painters Partition Problem? + +**Choices** +- [x] O( log(k) * (sum(boards) - max(boards))) +- [ ] O(k * log(sum(boards) - max(boards))) +- [ ] O(N * log(sum(boards) - max(boards))) +- [ ] O(k * log N) + + + +--- +### Problem 2 Aggresive Cows + +Given N cows & M stalls ,all M stalls are located at the different locations at x-axis, place all the cows such that minimum distance between any two cows is maximized. +> Note : +> 1. There can be only one cow in a stall at a time +> 2. We need to place all cows + +**Testcase 1** +```cpp +stalls = [1, 2, 4, 8, 9] +cows = 3 +stall = 5 +``` +**Solution** + +```cpp +T = 3 +``` +**Explaination TestCase 1** + + + +| 1 | 2 | 4 | 8 | 9 | Min distance | +|:---:|:---:|:---:|:---:|:---:|:------------:| +| c1 | c2 | c3 | | | 1 | +| c1 | | c2 | | c3 | 3 | +| c1 | | | c2 | c3 | 1 | + + +* If we put cows according to the first configuration then min distance = 1 because of c1 and c2 (shortest distance between any two cows is 1). +* If we put cows according to the Second configuration then min distance = 3 because of c1 and c2 (shortest distance between any two cows is 3) +* If we put cows according to the third configuration then min distance = 1 because of c2 and c3 (shortest distance between any two cows is 1). +* Therefore answer = max(1,3,1) = 3 + +**Testcase 2** +```cpp +stalls = [2, 6, 11, 14, 19, 25, 30, 39, 43] +cows = 4 +stall = 9 +``` +**Solution** + +```cpp +T = 12 +``` +**Explaination TestCase 2** + +| 2 | 6 | 11 | 14 | 19 | 25 | 30 | 39 | 43 | Min distance | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:------------:| +| c1 | c2 | c3 | c4 | | | | | | 3 | +| c1 | | c2 | | c3 | | c4 | | | 8 | +| c1 | | | c2 | | | c3 | | c4 | 12 | + +* If we put cows according to the first configuration then min distance = 3 +* If we put cows according to the Second configuration then min distance = 8 +* If we put cows according to the third configuration then min distance = 12 +* Therefore answer = max(3,8,12) = 12 + + +--- +### Question +What is the objective of the problem described? + +**Choices** +- [ ] Place cows in stalls randomly. +- [ ] Place cows in stalls such that the distance between any two cows is minimized. +- [x] Place cows in stalls such that the minimum distance between any two cows is maximized. +- [ ] Place cows in stalls such that the total distance is minimized. + +--- +### Question +What will be the maximum value of the distance between the closest cows in this case? +A: 0, 3, 4, 7, 9, 10 +K = 4 + + +**Choices** +- [ ] 10 +- [ ] 4 +- [x] 3 +- [ ] 2 + + + +**Explanation:** + +The 4 cows are placed in stalls at 0, 3, 7, 10. This is the optimal configuration. + +The value between the closest cows can be found by += min(3 - 0, 7 - 3, 10 - 7) += min(3, 4, 3) += 3 + +Thus the maximum result is 3 over all possible configurations. + + + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +### Aggresive Cows Binary Search Approach + + +Let's use testcase 2 to get the intuition of the question. + +This question is similar to Painter's Partition problem. Instead of minimising the maximum answer, we have to maximise the minimum distance. + +#### Search Space + +* **Worst Case:** +If say there are same cows as the number of stalls, then we place each cow at 1 stall. Then we can find difference between adjacent stalls. The minimum out of them is the answer. +**Example:** +`A[ ] = {4, 7, 14, 20}` +`7 - 4 = 3` +`14 - 7 = 7` +`20 - 14 = 6` +`min(3, 7, 6) = 3(answer)` +Though, we can take 1 as the minimum value. + +* **Best Case:** +There are two cows. Then, we can place them at the corner stalls. The distance between first and last stall will be the answer. + +**Search Space:** [1 A[N-1]-A[0]] + +#### Condition +Say we land at mid, now we can check if it is possible to keep cows at a minimum distance of mid. +* If yes, save it and check for farther distance, i.e, move right. +* Else, if keeping at a distance of mid is not possible, then we should try reducing the distance; hence, move left. + +**Example 1:** +*Let's check if we can put 4 cows at minimum distance of 20.* + + | 2 | 6 | 11 | 14 | 19 | 25 | 30 | 39 | 43 | Min distance | + |:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:------------:| + | c1 | | | | | c2 | | | | 20 | + +In above configuration minimum distance is 20 but we are unable to accommodate all cows(no place for c3 and c4). This means that we have to reduce the distance to accomodate all cows. + +**Example 2:** +*Let's check if we can put cows at minimum distance of atleast 5 below is a configuration that satisfy the condition.* + +| 2 | 6 | 11 | 14 | 19 | 25 | 30 | 39 | 43 | Min distance | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:------------:| +| c1 | | c2 | | c3 | c4 | | | | 5 | + +Since we are able to place all cows at a minimum distance of 5, we should save it as answer and try to maximise this distance. + + +--- +### Aggresive Cows Dry Run and Pseudocode + + +Below is the trace of algorithm on above Example :- + +* Intially the Hi = 41 and Lo = 3 (By using above defined criteria for search space) therefore using the above algorithm Mid = $3 + (41 - 3)/2 = 22$ then we check if it is possible to accommodate 4 cows completely in the shelters with min distance being 22 units We could not find any such configuration that satisfy the condition (got to left) below one failed configuration :- + + | 2 | 6 | 11 | 14 | 19 | 25 | 30 | 39 | 43 | Min distance | + |:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:-----------------------------------:| + | c1 | | | c2 | | | | c3 | | N/A since all cows not accommodated | + +* Now the Hi = 21 and Lo = 3 therefore using the above algorithm Mid = $3 + (21 - 3)/2 = 12$ then we check if it is possible to accommodate 4 cows completely in the shelters with min distance being 12 units below is configuration that satisfies the condition (we go to right) :- + +| 2 | 6 | 11 | 14 | 19 | 25 | 30 | 39 | 43 | Min distance | +|:---:|:---:|:---:|:---:| --- | --- |:---:| --- | --- |:------------:| +| c1 | | | c2 | | | c3 | | c4 | 12 | + +* Now the Hi = 21 and Lo = 13 therefore using the above algorithm Mid = $13 + (21 - 13)/2 = 17$ then we check if it is possible to accommodate 4 cows completely in the shelters with min distance being 17 units We could not find any such configuration that satisfy the condition (got to left) below one failed configuration :- + + | 2 | 6 | 11 | 14 | 19 | 25 | 30 | 39 | 43 | Min distance | +|:---:|:---:|:---:|:---:| --- | --- |:---:| --- | --- |:------------:| +| c1 | | | | c2 | | | c3 | | N/A since all cows not accommodated | + + + + +#### Pseudocode +```cpp + +bool check(v[], int x, int c) { + n = v.size(); + count = 1; + last = 0; + for (i = 0; i < n; i++) { + if (v[i] - v[last] >= x) { + last = i; //cow placed + count++; + } + if (count >= c) { + return true; + } + } + return false; +} + +// Function to find the maximum possible +// minimum distance between the cows +aggressive_cows(v[], size, cows) { + int lo = 0; + for (i = 1; i < n; i++) { + lo = min(lo, v[i] - v[i - 1]); + } + hi = v[n - 1] - v[0]; + ans = -1; + + // Applying Binary search + while (lo <= hi) { + mid = lo + (hi - lo) / 2; + if (check(v, mid, cows)) { + ans = mid; + lo = mid + 1; + } else { + hi = mid - 1; + } + } + + return ans; +} +``` + +--- +### Binary Search Problems Identification + +* These type of problems generally has following characteristics :- + * There are two or three parameter & constraints + * Requirement is to maximize or minimize the given parameter +* One tricky point is to find search space which is generally the parameter asked to maximize or minimize. +* The problem should be **Monotonic** in nature i.e after one point it is not feasible to solve or vice versa. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Sorting 1 Count Sort & Merge Sort.md b/Academy DSA Typed Notes/Advanced/DSA Sorting 1 Count Sort & Merge Sort.md new file mode 100644 index 0000000..3c9b5fa --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Sorting 1 Count Sort & Merge Sort.md @@ -0,0 +1,556 @@ +# Count Sort & Merge Sort + +--- +## Count Sort + +Find the smallest number that can be formed by rearranging the digits of the given number in an array. Return the smallest number in the form an array. + +**Example:** +A[ ] = `{6, 3, 4, 2, 7, 2, 1}` +Answer: `{1, 2, 2, 3, 4, 6, 7}` + +A[ ] = `{4, 2, 7, 3, 9, 0}` +Answer: `{0, 2, 3, 4, 7, 9}` + +#### Observation/Hint +we can to construct a number using digits. The digits in a number can only `range from 0 to 9`, thus instead of sorting the number which takes `O(N log N)` time, one can leverage this fixed range to derive a faster solution. + +#### Approach + +* **Frequency Count:** Create an `array of size 10` to count the frequency of each digit in the given number. +* Using the frequency array, reconstruct the original array in ascending order. +* This method of sorting based on frequency counting is often called "**`Count Sort`**". + +#### Pseudocode + +```cpp +Frequency Array of size 10 +F = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +for i -> 0 to(N - 1) { + F[A[i]]++ +} + +k = 0 + +for d -> 0 to 9 { // For each digit + for i -> 1 to F[d] { + A[k] = d + k++ + } +} + +return A +``` + +#### Dry Run + +* A = `[1, 3, 8, 2, 3, 5, 3, 8, 5, 2, 2, 3]` (Given Array) +* F = `[0, 1, 3, 4, 0, 2, 0, 0, 2, 0]` (Frequency Array) +* Reconstructing A using F: +1 (once), 2 (three times), 3 (four times), 5 (two times), 8 (two times) +* Resulting A = `[1, 2, 2, 2, 3, 3, 3, 3, 5, 5, 8, 8]` + +#### TC and SC +* **Time Complexity:** O(N) +* **Space Complexity:** O(1) (Since the size of the frequency array is constant, regardless of the size of N). + +--- +### Count Sort on large values + +### Will Count Sort work if the range of A[i] is more than $10^9$? + +* Count Sort isn't suitable for a range of $10^9$ because a frequency array of this size would demand too much memory. +* Count Sort works well when the range of A[i] is ~ $10^6$. + +Each integer typically occupies `4 Bytes`. + +Storing $10^9$ integers requires 4GB, which is often impractical. An array up to $10^6$ in length is more manageable, needing 4MB. + +--- +### Count Sort on Negative Numbers + +Implement Count Sort for an array containing negative numbers. + +#### Observation/Hint +Unlike conventional **Count Sort**, which operates on non-negative integers, this variation needs to account for negative numbers. The method involves adjusting indices in the frequency array based on the smallest element in the original array. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach + +* **Find Range:** Determine the smallest and largest elements in the array to ascertain the range. +* **Adjust for Negative Numbers:** By adjusting indices in the frequency array based on the smallest element, negative numbers can be accounted for. + +**Example** + +* Given A = [-2, 3, 8, 3, -2, 3] +* Smallest = -2, Largest = 8 +* Range = 11 (8 - (-2) + 1) +* Frequency array F = [2, 0, 0, 3, 0, 0, 0, 0, 1] +* 0th index frequency is mapped with -2, 1st index with -1, and so on. +* Reconstructed A using F: -2, -2, 3, 3, 3, 8 + +#### Pseudocode + +```cpp +//Find smallest and largest elements in A +//Create a frequency array F of size (largest - smallest + 1) + +for i -> 0 to(N - 1) { + F[A[i] - smallest_element]++ +} + +//Reconstruct array A using F + +for each index i in F { + while F[i] > 0 { + Append(i + smallest_element) to A + F[i]-- + } +} +``` + +#### TC and SC +* **Time Complexity (TC):** O(N) +* **Space Complexity (SC):** O(N + Range) + +--- +### Merge two sorted arrays + +Giver an integer array where all odd elements are sorted and all even elements are sorted. Sort the entire array. + +A[] = {`2, 5, 4, 8, 11, 13, 10, 15, 21`} + +#### Approach +We can take two separate arrays to keep even(EVEN[]) and odd(ODD[]) elements. Then we can merge them in the original array. + +We will keep three pointers here: `a(for original array)`, `e(for even array)` and `o(for odd array)`, all starting at index 0. + +If A[a] is odd, ODD[o]=A[a], o++, a++ +If A[a] is even, EVEN[e]=A[a], e++, a++ + +--- +#### Pseudocode + +```java +void merge(A[]) { + int N = A.length(); + //n1: count of even elements + //n2: count of odd elements + int EVEN[n1], ODD[n2]; + int a = 0, e = 0, o = 0; + + for (int i = 0; i < N; i++) { + if (A[a] % 2 == 0) { + EVEN[e] = A[a]; + e++; + } else { + ODD[o] = A[a]; + o++; + } + a++; + } + + a = 0; // moves over A + e = 0; // moves over EVEN + o = 0; // moves over ODD + + while (e < n1 && o < n2) { + if (EVEN[e] < ODD[o]) { + A[a] = EVEN[e]; + e++; + } else { + A[a] = ODD[o]; + o++; + } + a++; + } + + while (e < n1) { + A[a] = EVEN[e]; + e++; + a++; + } + + while (o < n2) { + A[a] = ODD[o]; + a++; + o++; + } +} +``` + +--- +### Question +Iteration of merging 2 Arrays? + +**Choices** +- [ ] N ^ 3 +- [ ] N ^ 2 +- [x] 2 * N +- [ ] Constant + + +--- +### Merge Sort + +### Example: Sorting Examination Sheets +>A teacher collected the examination sheets of students randomly. Now, she needs to sort those sheets as per roll number of students. As she is smart, instead of sorting it by herself, she divided the sheets into two halves and gave each half to Kishore and Suraj for sorting. + +>Once she has the sorted halves, she just need to merge two sorted halves, which is significantly easier. + +>Kishore and Suraj also decided to repeat this and divided the sheets in two halves and gave them to their friends for sorting. + + + +>In this way, the last students will have one sheet only. They can directly gave that sheet to the students before them whose job will be to arrange those two sheets and pass it above. + + + + +>In this way, the sheets are finally sorted. + +**Example: Sorting Numbers** +Sort the array, A = {3, 10, 6, 8, 15, 2, 12, 18, 17} + +#### Divide + +* The idea is to divide the numbers in two halves and then start merging the sorted arrays from bottom and pass above. + + + +#### Merge +- Merging [3] and [10] as [3, 10] + + +- Merging [3, 10] and [6] as [3, 6, 10] + + +- Merging [8] and [15] as [8, 15] + + +- Merging [3, 6, 10] and [8, 15] as [3, 6, 8, 10, 15] + + +- Merging [2] and [12] as [2, 12] + + +- Merging [18] and [17] as [17, 18] + + +- Merging [2, 12] and [17, 18] as [2, 12, 17, 18] + + +- Merging [3, 6, 8, 10, 15] and [2, 12, 17, 18] as [2, 3, 6, 8, 10, 12, 15, 17, 18] + + +In this way, we have finally sorted the array. + +***This algorithm of dividing the array into multiple subproblems and merging them one by one is called Merge Sort.*** + +*Since we are breaking down the array into multiple subproblems and applying the same idea to merge them, we are using the technique of Recursion.* + + +#### Psuedocode +```java +void merge(A[], l, mid, r) { + int N = A.length(); + int n1 = mid - l + 1; + int n2 = r - mid; + + int B[n1], C[n2]; + + int idx = 0; + for (int i = l; i <= mid; i++) { + B[idx] = A[i]; + idx++; + } + + idx = 0; + for (int i = mid + 1; i <= r; i++) { + C[idx] = A[i]; + idx++; + } + + idx = l; + i = 0; // moves over A + j = 0; // moves over B + + while (i < n1 && j < n2) { + if (B[i] <= C[j]) { + A[idx] = B[i]; + i++; + } else { + A[idx] = C[j]; + j++; + } + idx++; + } + + while (i < n1) { + A[idx] = B[i]; + idx++; + i++; + } + + while (j < n2) { + A[idx] = C[j]; + idx++; + j++; + } +} + +void mergeSort(int A[], l, r) { + if (l == r) return; // base case + + int mid = (l + r) / 2; + mergeSort(A, l, mid); + mergeSort(A, mid + 1, r); + merge(A, l, mid, r); +} +``` + +#### Complexity Analysis: +If we divide the arrays in two halves, we will have a tree structure as: + + +

+The time taken at every level is the time taken by merging the arrays which will be O(N). + +Height of Tree / Number of Levels - O(log N) + +Thus, +***Time Complexity:* O(N * log(N))** + + +**Space Complexity:** O(N) + +For recursive stack, we require O(logN) space. And at every level, we are using O(N) space for merging but since we are freeing that as well. We are utilizing O(N) in total merging. +Thus, space complexity is O(logN) + O(N) = O(N) + +> Merge sort is stable as arrangement of elements is taking place at merge step which is essentially maintaining the relative order of elements. + +--- +### Calculate no of pairs such that A[i] > B[j] +Given two array, A[n] and B[m]; Calculate number of pairs i,j such that A[i] > B[j]. + +**Example** +A[3] = `{7, 3, 5}` +B[3] = `{2, 0, 6}` + +**Explanation** +`(7,2) (7,0) (7,6) (3,2) (3,0) (5,2) (5,0)` (7 pairs) + +:::warning +Please take some time to think about the bruteforce approach on your own before reading further..... +::: + +#### Brute Force Approach +Take 2 loops and compare the values + +#### TC & SC +* Time complexity is O(n * m) +* Space complexity is O(1) + +#### Appoach 2 with Dry Run + +1. Sort both the arrays +2. Create one array, C[6] for merging both the arrays +3. Assign pointer P1, P2, P3 to A[0], B[0], C[0] respectively +4. A[3] = {3, 5, 7} `<-- P1` +5. B[3] = {0, 2, 6} `<-- P2` +6. `B[0] < A[0]` means 0 is smaller than every element in A from index 0 onwards; **`count of pairs = 3 (3,0)(5,0)(7,0)`**; C[] ={0}; `P2=1` +7. `B[1] < A[0]` means 2 is smaller than every element in A from index 0 onwards; **`count of pairs = 6 (3,0)(5,0)(7,0)(3,2)(5,2)(7,2)`**; C[] ={0, 2}; `P2=2` +8. `B[2] > A[0]` means 6 can't form a pair with 3. We are done with 3, because if 6 can't make a pair, no other element after 6 can make a pair with 3; C[]={0, 2, 3}; `P1=1` +9. `B[2] > A[1]` means 6 can't form a pair with 5. We are done with 5, because if 6 can't make a pair, no other element after 6 can make a pair with 5; C[]={0, 2, 3, 5}; `P1=2` +10. `B[2] < A[2]` means 6 is smaller than every element in A from index 2 onwards; **`count of pairs = 7(3,0)(5,0)(7,0)(3,2)(5,2)(7,2)(7,6)`**; C[] ={0, 2, 3, 5, 6}; `P2=3` +11. B is empty, we can push all elements remaining in A to C; C[] ={0, 2, 3, 5, 6, 7}; + + +#### Time Complexity +O(nlogn + mlogm + m + n) + +Here nlogn is the time complexity of sorting A array, mlogm is the time complexity for B array and m+n is the time complexity for merging both the arrays + +--- +### Inversion Count + +Given an a[n], calculate no of pairs [i,j] such that ia[j], i and j are index of array. + +Given a[5] = {10, 3, 8, 15, 6} + + +| i < j | a[i] > a[j] | +|:-------:|:-------------:| +| i=0, j=1 | a[0] > a[1] | +| i=0, j=2 | a[0] > a[2] | +| i=0, j=4 | a[0] > a[4] | +| i=2, j=4 | a[2] > a[4] | +| i=3, j=4 | a[3] > a[4] | + +Hence from the above table we can conclude that the ans is 5 as it is valid for only 5 pairs. + +### Question + +Consider the following array: [5, 2, 6, 1]. Calculate the inversion count for this array. + +**Choices** +- [ ] 1 +- [ ] 2 +- [ ] 3 +- [x] 4 + +--- +### Question + +Consider the following array: [5, 3, 1, 4, 2]. Calculate the inversion count for this array. + +**Choices** +- [ ] 0 +- [ ] 5 +- [ ] 6 +- [x] 7 + + +--- +### Inversion Count Brute Force + +Create all the pairs and check. + +#### Pseudocode +```java +for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { // since j is greater than i + if (a[i] > a[j]) + cnt++ + } +} +``` + +TC for the above code is $O(n^2)$ + +> This code will give us time limited exceeded error. So, we need to find a better apporach + +#### Optimised Approach + +**IDEA:** + +We will slipt the array into two equal parts, and keep on splitting the array till only 1 element is left, just like we do in MERGE SORT. + +Now, at the time of merging, we can keep counting the pairs. + +Basically, it will be same as what we did in previous question. As we merge the arrays, we can keep on calculating the answer. + + +#### Pseudocode - Small change to merge function + +```cpp +void merge(A[], l, mid, r) { + inv_count = 0; + int N = A.length(); + int n1 = mid - l + 1; + int n2 = r - mid; + + int B[n1], C[n2]; + + int idx = 0; + for (int i = l; i <= mid; i++) { + B[idx] = A[i]; + idx++; + } + + idx = 0; + for (int i = mid + 1; i <= r; i++) { + C[idx] = A[i]; + idx++; + } + + idx = l; + i = 0; // moves over A + j = 0; // moves over B + + while (i < n1 && j < n2) { + if (B[i] <= C[j]) { + A[idx] = B[i]; + i++; + } else { + A[idx] = C[j]; + j++; + + //**ONLY CHANGE IS THE BELOW LINE** + + //Here, we found element on right subarray to be smaller than an element on left, + //so we will count all the elements on left [i m-1] = m - i + inv_count = inv_count + (m - i); + } + idx++; + } + + while (i < n1) { + A[idx] = B[i]; + idx++; + i++; + } + + while (j < n2) { + A[idx] = C[j]; + idx++; + j++; + } +} +``` + +--- +## Stable Sort & Inplace + +### Stable Sort + +#### Definition: +Relative order of equal elements should not change while sorting w.r.t a parameter. + +**Examples** + +A[ ] = {6, 5, 3, 5} +After Sorting +A[ ] = {3, 5, 5, 6} + +In this case, which 5 comes first, which later, doesn't matter since it is just a singular data. + +But in actually scenario the objects to be sorted is collection of data. + +> Scenario: Let's talk about an Airport checkin line! +> It should be First Come first serve, whoever comes first should be allowed first to checkin. +> But according to airline, all the members are not same. Some would be economic, business class, priveledged/ priorty... +> Say Anand(economic class) is standing and Amir(economic class) comes and tries to move ahead Anand, will Anand be okay with it? Not Really! +> Say Anupriya(Business Class), now Anand would be okay! +> The above example explains why stable sorting is important. + +**Another Example:** + +| Name | Marks | +| -------- | -------- | +| A | 8 | +| B | 5 | +| C | 8 | +| D | 4 | +| E | 8 | + +Sort acc to marks. In which case, if this is stable sort, A,C,E should appear in the same order. + +After Sorting + +| Name | Marks | +| -------- | -------- | +| D | 4 | +| B | 5 | +| A | 8 | +| C | 8 | +| E | 8 | + +#### Inplace + +- No extra space +- Space complexity: O(1) \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Sorting 2 Quick Sort & Comparator Problems.md b/Academy DSA Typed Notes/Advanced/DSA Sorting 2 Quick Sort & Comparator Problems.md new file mode 100644 index 0000000..972e460 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Sorting 2 Quick Sort & Comparator Problems.md @@ -0,0 +1,606 @@ +# Sorting 2: Quick Sort & Comparator Problems + +--- +## Problem 1 Partition the array +**Problem Description** + +Given an integer array, consider first element as pivot, rearrange the elements such that for all **`i`**: + +if **`A[i] < p`** then it should be present on left side +if **`A[i] > p`** then it should be present on right side + +**Note:** All elements are distinct + +> + + +### Example: +> + + +

+ +**The State of the array after Partitioning will be:** + +> + + +--- +### Question +Given an integer array, consider first element as pivot **p**, rearrange the elements such that for all **`i`**: + +if **`A[i] < p`** then it should be present on left side +if **`A[i] > p`** then it should be present on right side + +`A = [10, 13, 7, 8, 25, 20, 23, 5]` + + +**Choices** +- [ ] left side = [10, 7, 5, 8] right side = [10, 13, 25, 20, 23] +- [ ] left side = [10, 13, 7, 8] right side = [25, 20, 23, 5] +- [ ] left side = [13, 25, 20, 23] right side = [7, 8, 5] +- [x] left side = [7, 8, 5] right side = [13, 25, 20, 23] + + + +**Explanation**: + +The pivot value is `10` + +The elements lesser than the pivot are `[7, 8, 5]` +The elements greater than the pivot are `[13, 25, 20, 23]` + +Thus, `left side = [7, 8, 5] right side = [13, 25, 20, 23]` + + + + +--- +### Partition the array Approach + + +* Partitioning begins by locating two position markers—let’s call them **`leftmark`** and **`rightmark`**—at the beginning and end of the remaining items in the list. +* The goal of the partition process is to move items that are on the wrong side with respect to the pivot value while also converging on the split point. + +#### Process + +* We begin by incrementing leftmark until we locate a value that is greater than the pivot value. +* We then decrement rightmark until we find a value that is less than the pivot value. +* At this point we have discovered two items that are out of place with respect to the eventual split point. **For our example, this occurs at 93 and 20. Now we can exchange these two items and then repeat the process again.** +> + +**Continue:** + +> + +* **At the point where rightmark becomes less than leftmark, we stop**. The position of rightmark is now the split point. The pivot value can be exchanged with the contents of the split point and the pivot value is now in place +> + +* **Now, we can exchange the 54(Pivot) with 31** +> + + +#### Pseudocode +```cpp +partition(A,first,last): + pivotvalue = A[first] + + leftmark = first+1 + rightmark = last + + while leftmark <= rightmark: + + if A[leftmark] <= pivotvalue: + leftmark = leftmark + 1 + + else if A[rightmark] > pivotvalue: + rightmark = rightmark -1 + + else: + temp = A[leftmark] + A[leftmark] = A[rightmark] + A[rightmark] = temp + + // swap pivot element with element present at rightmark + temp = A[first] + A[first] = A[rightmark] + A[rightmark] = temp +``` + +--- +## Quick Sort + + +*Sorting is the process of organizing elements in a structured manner.* + +**Quicksort** is one of the most popular sorting algorithms that uses **nlogn** comparisons to sort an array of n elements in a typical situation. Quicksort is based on the **divide-and-conquer strategy**. We’ll take a look at the Quicksort algorithm in this session and see how it works. + +* A quick sort first selects a value, which is called the **pivot value**. +* Although there are many different ways to choose the pivot value, we will simply use the first item in the list. +* The role of the pivot value is to assist with splitting the list. +* The actual position where the pivot value belongs in the final sorted list, commonly called the **split point**, will be used to divide the list for subsequent calls to the quick sort. + +As per the previous example, +> + +Now that there are two separate subarrays, we can apply partitioning on both separately and recursively. With each call, pivot element will be placed at its correct possition and eventually all elements will come at their correct place. + +### Steps to execute Quick Sort +1. **Pick**: Select an element. +2. **Divide**: Split the problem set, move smaller parts to the left of the pivot and larger items to the right. +3. **Repeat and combine**: Repeat the steps on smaller subarrays and combine the arrays that have previously been sorted. + +#### Dry Run + + + +#### Pseudocode + +Below is the code for QuickSort + +```java +void quicksort(int[] A, int start, int end) { + if (start < end) { + int pivotIndex = partition(A, start, end); + quicksort(A, start, pivotIndex - 1); + quicksort(A, pivotIndex + 1, end); + } +} +``` + +--- +### Quick Sort Time Complexity and Space Complexity + +#### Best-Case Time Complexity: + +The best-case scenario for QuickSort occurs when the pivot chosen at each step divides the input into approximately equal-sized subarrays. + + +> + +#### Worst-Case Time Complexity: + +The worst-case scenario for QuickSort occurs when the pivot chosen at each step is either the smallest or largest element in the remaining unsorted portion of the array. This leads to imbalanced partitions, and the algorithm performs poorly. The worst-case time complexity is $O(N^2)$, which occurs when the input is already sorted in ascending or descending order. +> + + +#### Average-Case Time Complexity + +There are many ways to avoid the worst case of quicksort, like choosing the element from the middle of the array as pivot, randomly generating a pivot for each subarray, selecting the median of the first, last, and middle element as pivot, etc. By using these methods, we can ensure equal partitioning, on average. Thus, quick sort's average case time complexity is O(NlogN) + + +#### Space Complexity +The Space Complexity in quick sort will be because of recursion space. Partition function doesn't take any extra space. + +So, space in Quick Sort is only because of Recursion Stack whereas in Merge Sort, the extra space is also taken by Merge Fucntion. + +**In Quick Sort**, +In worst case, Space is **O(N)** since in recursive tree we have N levels. + +In best case, Space is **O(log N)** since there are log N levels. + +--- +### Randomised QuickSort + +The randomised quicksort is a technique where we randomly pick the pivot element, not necessarily the first and last. + +There is a random function available in all the languages, to which we can pass Array and get random index. Now, we can swap random index element with first element and execute our algorithm as it is. + +#### Why picking random element helps? + +Randomised quicksort help us to get away with the worst case time complexity. + +The odds of always choosing the minimum element or maximum element is very low. + +**Example:** +Given N elements, probablity that a random element is minimum - 1/N +Probability that again next time the random element is munimum - 1/N-1 +Then,.. 1/N-2 +Then,.. 1/N-3... + +1/N * 1/N-1 * 1/N-2 * ..... +1/N! + +This value is very small!! + +Hence, using randomised quick sort, we can achieve average case of O(N logN) most of the time. + +--- +## Comparator + + +* In programming, a **comparator** is a function that compares two values and returns a result indicating whether the values are equal, less than, or greater than each other. +* The **comparator** is typically used in sorting algorithms to compare elements in a data structure and arrange them in a specified order. + +**Comparator** is a function that takes **two arguments**. + + +For languages - **Java, Python, JS, C#, Ruby**, the following logic is followed. + +``` +1. In sorted form, if first argument should come before second, -ve value is returned. +2. In sorted form, if second argument should come before first, +ve value is returned. +3. If both are same, 0 is returned. +``` +For **C++**, following logic is followed. +``` +1. In sorted form, if first argument should come before second, true is returned. +2. Otherwise, false is returned. +``` + +--- +### Problem 2 Sorting based on factors + + +Given an array of size n, sort the data in ascending order of count of factors, if count of factors are equal then sort the elements on the basis of their magnitude. + +**Example 1** + +```plaintext +A[ ] = { 9, 3, 10, 6, 4 } +Ans = { 3, 4, 9, 6, 10 } +``` +**Explanation:** + +Total number of factors of 3, 4, 9, 6, 10 are 2, 3, 3, 4, 4. + +--- +### Question +Given an array A of size n, sort the data in ascending order of count of factors, if count of factors are equal then sort the elements on the basis of their magnitude. + +`A = [10, 4, 5, 13, 1]` + +**Choices** +- [ ] [1, 4, 5, 10, 13] +- [x] [1, 5, 13, 4, 10] +- [ ] [13, 10, 4, 5, 1] +- [ ] [1, 4, 5, 13, 10] + +**Explanation:** + +Total number of factors of 1, 5, 13, 4, 10 are 1, 2, 2, 3, 4. + + +--- + + +### Sorting based on factors Solutions + +#### C++ +```cpp +int factors(int n) { + int count = 0; + int sq = sqrt(n); + + // if the number is a perfect square + if (sq * sq == n) + count++; + + // count all other factors + for (int i = 1; i < sqrt(n); i++) { + // if i is a factor then n/i will be + // another factor. So increment by 2 + if (n % i == 0) + count += 2; + } + return count; +} + +bool compare(int val1, int val2) { + int cnt_x = count_factors(x); + int cnt_y = count_factors(y); + + if (factors(val1) == factors(val2)) { + if (val1 < val2) { + return true; + } + return false; + } else if (factors(val1) < factors(val2)) { + return true; + } + return false; +} + +vector < int > solve(vector < int > A) { + sort(A.begin(), A.end(), compare); + return A; +} +``` + + +#### Python +```cpp +import functools + +//please write the code for finding factors by yourself + +def compare(v1, v2): + if (factors(v1) == factors(v2)): + if (v1 < v2): + return -1; +if (v2 < v1): + return 1; +else + return 0; +elif(factors(v1) < factors(v2)): + return -1; +else + return 1; + +class Solution: + def solve(self, A): + A = sorted(A, key = functools.cmp_to_key(compare)) +return A +``` +#### Java +```cpp +//please write the code for finding factors by yourself + +public ArrayList < Integer > solve(ArrayList < Integer > A) { + Collections.sort(A, new Comparator < Integer > () { + @Override + public int comp(Integer v1, Integer v2) { + if (factors(v1) == factors(v2)) { + if (v1 < v2) return -1; + else if (v2 < v1) return 1; + return 0; + } else if (factors(v1) < factors(v2)) { + return -1; + } + return 1; + } + }); + return A; +} +``` + +--- +### Problem 3 B Closest Points to Origin + + +Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane and an integer k, return the B closest points to the origin (0, 0). + +The distance between two points on the X-Y plane is the Euclidean distance (i.e., $√(x1 - x2)^2 + (y1 - y2)^2$). + +You may return the answer in any order. + +**Example 1:** +> + +>**Input:** points = [[1,3],[-2,2]], B = 1 +**Output:** [[-2,2]] +**Explanation:** +The distance between (1, 3) and the origin is sqrt(10). +The distance between (-2, 2) and the origin is sqrt(8). +Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin. +We only want the closest B = 1 points from the origin, so the answer is just [[-2,2]]. + + +**Example 2:** + +>**Input:** points = [[3,3],[5,-1],[-2,4]], B = 2 +**Output:** [[3,3],[-2,4]] +**Explanation:** The answer [[-2,4],[3,3]] would also be accepted. + +--- +**B Closest Points to Origin Approach** + + +We find the B-th distance by creating an array of distances and then sorting them using custom sorting based on distances from origin or points. + +After, we select all the points with distance less than or equal to this K-th distance. + +**Logic for Custom Sorting** + +Say there are two points, (x1, y1) and (x2, y2), +The distance of (x1, y1) from origin will be ${sqrt((x1-0)^2 + (y1-0)^2)}$ +The distance of (x2, y2) from origin will be ${sqrt((x2-0)^2 + (y2-0)^2)}$ + +We can leave root part and just compare $(x1^2 + y1^2) and (x2^2 + y2^2)$ + +**Below logic works for languages like - Java, Python, JS, ...** +```cpp +// Need to arrange in ascending order based on distance + +// If first argument needs to be placed before, negative gets returned +if((x1*x1 + y1*y1) < (x2*x2 + y2*y2)) + return -1; +// If second argument needs to be placed before, positive gets returned +else if ((x1*x1 + y1*y1) > (x2*x2 + y2*y2)) + return 1; +// If both are same, 0 is returned +else return 0 +--------------------------------------------- +// Instead of writing like above, we could have also written + +return ((x1*x1 + y1*y1) - (x2*x2 + y2*y2)) +``` + +#### Below logic works for C++ +```cpp +// If first argument needs to be placed before, true gets returned +if ((x1 * x1 + y1 * y1) < (x2 * x2 + y2 * y2)) + return true; +//Else false is returned +else return false +``` + +--- +### Problem 4 Largest Number + +Given a list of non-negative integers nums, arrange them such that they form the largest number and return it. + +Since the result may be very large, so you need to return a string instead of an integer. + +Example 1: + +>Input: nums = [10,2] +Output: "210" + +Example 2: + +>Input: nums = [3,30,34,5,9] +Output: "9534330" + +#### Idea: + +Should we sort the numbers in descending order and append them ? + +While it might be tempting to simply sort the numbers in descending order, +but this doesn't work. + +**For example,** sorting the problem example in descending order would produce the number **9534303**, while the correct answer is achieved by putting **3** before **30**. + +--- +### Question +Given a list of non-negative integers **nums**, arrange them such that they form the largest number and return it. + +nums = [10, 5, 2, 8, 200] + +**Choices** +- [ ] 20010825 +- [x] 85220010 +- [ ] 88888888 +- [ ] 85200210 + + +**Explanation:** + +After rearrangeing the nums, [8, 5, 2, 200, 10] will form the largest number as **"85220010"**. + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +--- +### Larget Number Approach + +We shall use **custom sorting**. +Say we pick two numbers **X** and **Y**. Now, we can check if **`X (appends) Y`** > **`Y (appends) X`**, then it means that **Y** should come before **X**. + +For example, let X and Y be 542 and 60. To compare X and Y, we compare 54260 and 60542. Since 60542 is greater than 54260, we put Y first. + +Once the array is sorted, the most "signficant" number will be at the front. + +**Edge Case** +There is a minor edge case that comes up when the array consists of only +zeroes, so if the most significant number is 0, we can simply return 0. Otherwise, we build a string out of the sorted array and return it. + +**Example** +Upon sorting this array - **`[3,30,34,5,9]`**, +we shall get - **`[9, 5, 34, 3, 30]`** + +Now, we can simply append the numbers to get - **`9534330`** + +#### Complexity +**Time complexity :** O(n log n) +Although we are doing extra work in our comparator, it is only by a constant factor. Therefore, the overall runtime is dominated by the complexity of sort, which is O(n log n). + +**Space complexity :** O(n) +Space depends on the type of algorithm used by the sort function internally. + +--- +### Larget Number Codes in different langauges +#### C++ +```cpp +bool compare(int a, int b) { + return to_string(a) + to_string(b) > to_string(b) + to_string(a); +} + +string largestNumber(vector < int > & A) { + sort(A.begin(), A.end(), compare); + string ans = ""; + for (auto & x: A) + ans += to_string(x); + if (ans[0] == '0') return "0"; + return ans; +} +``` + +#### Java + +```cpp +public class Solution { + public String largestNumber(ArrayList < Integer > A) { + Collections.sort(A, new Comparator < Integer > () { + public int compare(Integer a, Integer b) { + String XY = String.valueOf(a) + String.valueOf(b); + String YX = String.valueOf(b) + String.valueOf(a); + return XY.compareTo(YX) > 0 ? -1 : 1; + } + }); + StringBuilder ans = new StringBuilder(); + for (int x: A) { + ans.append(String.valueOf(x)); + } + if (ans.charAt(0) == '0') + return "0"; + return ans.toString(); + } +} +``` + +#### Python +```cpp +from functools import cmp_to_key + +class Solution: + # @param A : list of integers + # @return a strings + def largestNumber(self, A): + def cmp_func(x, y): + if x + y > y + x: + return -1 + elif x == y: + return 0 + else: + return 1 + + nums = [str(num) for num in A] + nums.sort(key = cmp_to_key(cmp_func)) + if nums[0] == '0': + return '0' + return ''.join(nums) +``` + +--- +### Question +Best case TC of quick sort? + +**Choices** +- [ ] N +- [ ] N^2 +- [x] N log N +- [ ] Constant + +### Question +Worst case TC of quick sort? + +**Choices** +- [ ] N +- [x] N^2 +- [ ] N log N +- [ ] Constant + +--- +### Question +Worst case SC of quick sort? + +**Choices** +- [x] N +- [ ] N^2 +- [ ] N log N +- [ ] Constant + +--- +### Question +Best case SC of quick sort? + +**Choices** +- [ ] N +- [ ] N^2 +- [ ] N log N +- [x] log N + diff --git a/Academy DSA Typed Notes/Advanced/DSA Stacks 1 Implementation & Basic Problems.md b/Academy DSA Typed Notes/Advanced/DSA Stacks 1 Implementation & Basic Problems.md new file mode 100644 index 0000000..416ca3a --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Stacks 1 Implementation & Basic Problems.md @@ -0,0 +1,507 @@ +# Stacks 1: Implementation & Basic Problems + +--- +## Introduction to Stacks with Example + +### Definition +* A stack is a linear data structure that stores information in a sequence, from **bottom to top**. +* The data items can only be accessed from the top and new elements can only be added to the top, i.e it follows **LIFO (Last In First Out)** principle. + +**Examples** +Before proceeding to more technical examples, let's start from the real life basic examples. +1. **Pile of Plates**:
Imagine a scenario where you have a pile of plates, you can only put a plate on the pile from top also only pick a plate from top. You can't really see the plates underneath the top one without first removing the top plate, which means only the first plate is accessible to you. + + + +2. **Stack of Chairs**:
We usually place identical chairs on the top of on another, which makes them look like a stack. Similar to the previous example you can only position or choose a chair from top, and you won't be able to take or see the chair in middle without picking out all chairs on top of that one. + + + + +### Algorithmic Examples +1. **Recursion**:
Recursion happens when a function calls itself. Each call is stacked on top of the previous one. When call execution finishes, control goes back to the second-to-last function call. This all happens with a stack data structure. +2. **Undo / Redo Operations**:
In software programs, stacks are commonly used to store the state during Undo and Redo operations. Consider the given example we have performed several calculations here, our first stack stores the current state. As soon as user performs UNDO operation the state is moved to REDO stack so that later it can be restored from there. + + + + +--- +### Question +What is the most common application of a stack? + +**Choices** +- [ ] Evaluating arithmetic expressions +- [ ] Implementing undo/redo functionality +- [ ] Representing parenthesis in expressions +- [x] All of the above + + +Answer: All of the above + +Explanation: Stacks are versatile data structures that find applications in various domains. They are commonly used in expression evaluation, undo/redo functionality, and representing parenthesis in expressions. + + +--- +### Operations on Stack + +These operations are generally used on the stack. The time complexity for all of these operations is constant **O(1)**. + +#### 1. Push +Push operation is to insert a new element into the top of stack. +```cpp +push(data) +``` + +#### 2. Pop +Pop operation is to remove an element from the top of stack. +```cpp +pop() +``` + +#### 3. Peek +Peek means to access the top element of the stack, this operation is also called as **top**. +```cpp +data = peek() +// or +data = top() +``` + +#### 4. isEmpty +This operation is used to check whether stack is empty or not. It is an important operation because it allows program to run efficiently by checking conditions of overflow and underflow. +```cpp +isEmpty() +``` + +### Question +What is the time complexity of the push and pop operations in a stack? + +**Choices** +- [x] O(1) for both push and pop +- [ ] O(n) for push and O(1) for pop +- [ ] O(1) for push and O(n) for pop +- [ ] O(n) for both push and pop + + +Answer: O(1) for both push and pop + +Explanation: The push and pop operations in a stack operate on the top element, making them constant time operations. This is because the top element is always accessible regardless of the stack's size. + +--- + + +### Implement Stack using Arrays +* Just try to think what a data structure is, a data structure is nothing but a way to store some data in memory along with some rules to insert/access/modify that data. +* So, stacks is also a way to store data with LIFO principle. The conclusion of this is we can implement stacks by using arrays. +* You might know that array is filled from left to right so the **rightmost part of the array can act as top of stack**, for each pop operation we can remove the rightmost element from array. +* We can keep track of the top element index in array because we can always know how many elements we have inserted so directly access that index from array to know about top element. +* To store an element we can just add 1 to top index and assign the element. + + + + +#### Pseudocode +```cpp +// Consider an array `A`. +int A[]; + +// Consider a counter to keep track of stack size and currently used index +int t = -1; +``` + +1. For push operation we can keep pushing data from left to right. +```cpp +void push(data){ + t++; + A[t] = data; +} +``` + +2. And as we are maintaining a counter we can always access the top element in O(1) by just index access of array. +```cpp +int top(){ + return A[t]; +} +``` + +3. To remove element we can simply decrement our counter. Also we can place some value at that index to denote that it is not part of our data. +```cpp +void pop(){ + t--; +} +``` + +4. We are maintaining our counter in such a way that it indicates the size of stack. We can simply perform an equality check on counter to know whether stack is empty. +```cpp +bool isEmpty(){ + return t == -1; +} +``` + + +--- +### Overflow and Underflow in stack and it's solution +* Overflow occurs when we try to store new data even when there is no empty space in array. For this we have to introduce a overflow condition before push operation. + +```cpp +void push(x){ + // Whenever our counter reaches to the size of the array + // It means stack is already full + if(t >= A.size()) + return; + t++; + A[t] = x; +} +``` + +* Underflow means when we try to perform pop operation or try to access the element of stack but there are none. Again we have to introduce conditions during pop and top operation. + +```cpp +void pop(){ + if(!isEmpty()) return; + t--; +} +``` + + +```cpp +int top(){ + if(!isEmpty()) return -1; + return A[t]; +} +``` + +### Problem with implementation using Arrays +We have to predefine the size of stack to create array. To overcome this problem we can create a dynamic array which can grow or shrink at runtime according to need. + +--- +### Question +What happens when you try to pop an element from an empty Stack? + +**Choices** +- [ ] It returns null +- [ ] It returns the top element +- [x] It causes an underflow +- [ ] It causes an overflow + +Attempting to pop an element from an empty stack will cause an underflow. + + +--- + +### Implement Stack using Linked List +* We can also implement stack using linked list, similar to the array it also has constant `O(1)` time complexity for all operations. +* We choose head as our top element because push and pop operations can be executed in `O(1)` in that case. +* Unlike array linkedlist can grow or shrink at runtime, because all operations are performed at head. + + + + +#### Pseudocode + +1. To push data into stack, just create a node and attach before head. +```cpp +void push(data) { + new_node = Create a new Node with 'data' + new_node.next = head + head = new_node + // Increment size + t++ +} +``` + +2. To pop data just remove one node from the beginning of linked list. +```cpp +void pop() { + if (!isEmpty()) return; + head = head.next + // Decrement size + t-- +} +``` + +3. To find the data on top just access the head node. +```cpp +int top() { + if (!isEmpty()) return -1; + return head.data; +} +``` + +> Note: While accessing top value in function, We can use another concept to indicate that stack is empty if we are using -1 as value to store in stack. + +--- +### Problem 3 Balanced Paranthesis Concept with Implementation + +Check whether the given sequence of parenthesis is valid ? + +#### Explanation of Problem +Imagine you have a bunch of different types of brackets, like `{` and `}` (curly brackets), `[` and `]` (square brackets), and `(` and `)` (round brackets). + +A valid sequence of these brackets means that for every opening bracket, there is a matching closing bracket. It's like having pairs of shoes; you need a left shoe and a right shoe for each pair. In a valid sequence, you have the same number of left and right brackets, and they are correctly matched. + +For example, `(({}))` is a valid sequence because for each opening bracket `(` or `{`, there is a corresponding closing bracket `)` or `}`. + +On the other hand, `{{})` is not valid because the second curly bracket `}` doesn't have a matching opening bracket, so it's like having an extra right shoe without a left shoe to match with. + +In summary, a valid sequence of brackets is like having balanced pairs of brackets, where each opening bracket has a matching closing bracket. + +**Technical Application -** +Imagine you are writing a small compiler for your college project and one of the tasks (or say sub-tasks) for the compiler would be to detect if the parenthesis are in place or not. + +--- +### Question +Which of the following expressions is balanced with respect to parentheses? + +**Choices** +- [x] `(a + b) * c` +- [ ] `(a + b)) * c` +- [ ] `(a + b)(c` +- [ ] `(a + b)c` + +--- +### Balanced Parenthesis Implementation +#### Idea +An interesting property about a valid parenthesis expression is that a sub-expression of a valid expression should also be a valid expression. (Not every sub-expression) e.g. + + + +#### Hint +What if whenever we encounter a matching pair of parenthesis in the expression, we simply remove it from the expression? + +The stack data structure can come in handy here in representing this recursive structure of the problem. We can't really process this from the inside out because we don't have an idea about the overall structure. But, the stack can help us process this recursively i.e. from outside to inwards. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach +* Iterate through the sequence, and whenever you encounter an opening parenthesis, you push it onto the stack. +* When you encounter a closing parenthesis, you pop the top element from the stack and compare it to the current closing parenthesis. If they are of the same type (matching), you continue; otherwise, the sequence is invalid. + +Additionally, if you finish iterating through the sequence and the stack is not empty, the sequence is also invalid. + + +#### Pseudocode +```cpp +bool is_valid_parentheses(sequence): + // Initialize an empty stack + + For each character 'char' in sequence: + If 'char' is an opening parenthesis ('(', '{', '['): + Push 'char' onto the stack + Else if 'char' is a closing parenthesis (')', '}', ']'): + If the stack is empty: + Return false + Pop the top element from the stack into 'top' + If 'top' is not of the corresponding opening type for 'char': + Return false + + If the stack is not empty: + Return false + Else: + Return true +``` + +#### Dry Run +**Example:** `{()[]}` + + + +1. Iterate on the example string. +2. First of all we will encounter `{`. We will push it onto the stack. +3. Next we have `(` again push onto the stack. +4. Now when we encountered `)`, It means there is a match so pop the top element and continue the iteration. +5. In next iteration we will encounter `[`. Similarly we will find the closing bracket in next iteration `]`. Pop that from stack. +6. In the end stack will only contain `{`. Now when we will encounter `}`, we will again pop the topmost bracket. +7. Finally there is nothing to iterate on as well as the stack is now empty. Which means the paranthesis sequence was valid. + + + +--- +### Problem 4 Remove equal pair of consecutive elements till possible + + + +Given a string, remove equal pair of consecutive elements till possible + +**Example** +Let's say we have a string like `abcddc`, The idea here is to check if there are any consecutive pairs of characters that are the same. In this case, we see `dd` is such a pair. When you find such a pair, you simply remove it from the string, and it becomes `abcc` Then, you repeat the process with the new string, searching for and removing consecutive matching pairs of letters. This cycle continues until there are no more matching pairs left to remove. +In the end the final string would be the solution. + + +**Approach** +This problem can be solved very efficiently by using the concept of stack. The stack will help you keep track of the elements that haven't been canceled out by a matching element. +```cpp +string remove_equal_pairs(s): + Initialize an empty stack + + For each character 'char' in s: + If the stack is not empty and 'char' matches the character at the top of the stack: + Pop the element from the stack + Else: + Push 'char' onto the stack + + Initialize an empty string 'result' + + While the stack is not empty: + Pop an element from the stack and prepend it to 'result' + + Return 'result' +``` + +#### Complexity +**Time Complexity:** O(n) +**Space Complexity:** O(n) + +--- +### Question +If we remove equal pair of consecutive characters in this string multiple times then what will be the final string: `abbcbbcacx` + +**Choices** +- [ ] empty string +- [ ] ax +- [x] cx +- [ ] x + + + +**Explanation:** + +Let's go through the step-by-step process for the given example: `abbcbbcacx`. + +1. Begin by pushing `a` onto the stack: **Stack - [a]** +2. Next, push `b` onto the stack: **Stack - [a, b]** +3. During the next iteration, we will encounter `b` which matches the top element `b` of the stack. Continue iterating with a pop operation. **Stack - [a]** +4. Proceed to push `c` during the next iteration, followed by `b`. **Stack - [a, c, b]** +5. During the subsequent iteration, encountering `b` matches the top element of the stack. Since a consecutive pair is found, perform a pop operation to remove the topmost character, which is `b`. **Stack - [a, c]** +6. As we encounter `c` again, and another `c` is already at the top of stack, pop `c` and continue iterating. **Stack - [a]** +7. The stack now contains only `a`. In the next iteration, encountering `a` leads to a pop operation for the existing `a`. **Stack - []** +8. Towards the end, push `c` and `x` onto the stack. Since there's no more to continue, the final stack **[c, x]**, represents the answer. + + + +--- +### Problem 5 Evaluate Postfix Expression + +Given a postfix expression, evaluate it. + +**Postfix Expression** contains operator after the operands. +Below is an example of postfix expression: + +```cpp +2 + 3 => Postfix => 2 3 + +``` + +#### Idea +An operator is present after the operands on which we need to apply that operator, hence stack is perfect data structure for this problem. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +We'll process the expression as follows- + +**Example 1** +```cpp +[2, 3, +] +``` +1. First we push 2 on stack. +2. Then we push 3. +3. Then we found '`+`', so we will pop top two operands, i.e 3 & 2 in this case +4. Final result is 2 + 3 = 5 + +**Example 2** +```cpp +[4, 3, 3, *, +, 2, -] +``` +1. First we push 4 on stack. +2. Then we push 3 and again 3. +3. Then we found ' `*` ', so we will pop top two operands, i.e 3 & 3 in this case and push 3 * 3 to the stack. So push 9. +4. Again we found '`+`', so pop the top two operands 9 and 4. Apply '`+`' operator 9 + 4 = 13 and push into the stack. Push 13. +5. Push 2. +6. Now we have an operator again '`-`', hence pop top two operands and push the result on the stack. 13-2 = 11. Push 11. +7. In the end the single operand on the stack will be our final answer which is 11. + + +--- +### Question +What is the final answer obtained using the stack-based evaluation algorithm for the expression `[5, 2, *, 3, -]`? + +**Choices** +- [ ] 8 +- [ ] 13 +- [x] 7 +- [ ] 15 + + +**Explanation:** + +1. Push 5 onto the stack. + `Stack: [5]` +2. Push 2 onto the stack. + `Stack: [5, 2]` +3. Encountering '*' - Pop the top two operands (2 and 5), and push the result (2 * 5 = 10) onto the stack. + `Stack: [10]` +4. Push 3 onto the stack. + `Stack: [10, 3]` +5. Encountering '-' - Pop the top two operands (3 and 10), and push the result (10 - 3 = 7) onto the stack. + `Stack: [7]` +6. Therefore, the final answer obtained using the stack-based evaluation algorithm for the expression `[5, 2, *, 3, -]`is 7. + + +--- +### Question + +Evaluate the given postfix expression: +```cpp +3 5 + 2 - 2 5 * - +``` + +**Choices** +- [ ] 0 +- [ ] 4 +- [x] -4 +- [ ] 8 + + +**Explanation:** + +Let's evaluate the given postfix expression step by step: `3 5 + 2 - 2 5 * -` + +1. Push 3 onto the stack: **Stack - [3]** +2. Push 5 onto the stack: **Stack - [3, 5]** +3. Encounter '`+`', pop 5 and 3, perform 3 + 5 = 8, push 8 onto the stack: **Stack - [8]** +4. Push 2 onto the stack: **Stack - [8, 2]** +5. Encounter '`-`', pop 2 and 8, perform 8 - 2 = 6, push 6 onto the stack: **Stack - [6]** +6. Push 2 onto the stack: **Stack - [6, 2]** +7. Push 5 onto the stack: **Stack - [6, 2, 5]** +8. Encounter '` * `', pop 5 and 2, perform 2 * 5 = 10, push 10 onto the stack: **Stack - [6, 10]** +9. Encounter '`-`', pop 10 and 6, perform 6 - 10 = -4, push -4 onto the stack: **Stack - [-4]** +10. End of the expression, the stack contains the final result: -4 +11. So, the result of the expression `3 5 + 2 - 2 5 * -` is `-4`. + + + +--- +### Evaluate Postfix Expression Pseudocode +#### Pseudocode +```cpp +int evaluate_postfix(expression): + Initialize an empty stack + + For each element 'element' in expression: + If 'element' is an operand: + Push 'element' onto the stack + Else if 'element' is an operator: + Pop 'operand2' from the stack + Pop 'operand1' from the stack + Perform the operation 'element' on 'operand1' and 'operand2' + Push the result back onto the stack + + The final result is at the top of the stack + Pop and return the result +``` + +#### Complexity +**Time Complexity:** O(n) +**Space Complexity:** O(n) diff --git a/Academy DSA Typed Notes/Advanced/DSA Stacks 2 Nearest Smaller or Greater Element.md b/Academy DSA Typed Notes/Advanced/DSA Stacks 2 Nearest Smaller or Greater Element.md new file mode 100644 index 0000000..2e23962 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Stacks 2 Nearest Smaller or Greater Element.md @@ -0,0 +1,506 @@ +# Stacks 2: Nearest Smaller/Greater Element + +--- +## Problem 1 Nearest smallest element on left + +Given an integer array A, find the index of nearest smallest element on left for all i index in A[]. +Formally , for all i find j such that `A[j] < A[i]`, `j < i` and j is maximum. + +**Example:** + +A[] = [8, 2, 4, 9, 7, 5, 3, 10] +Answer = [-1, -1, 1, 2, 2, 2, 1, 6] + +For each element in the input array, the output indicates the index of the nearest smaller element on the left side of that element. If there's no smaller element on the left, it's represented by -1. + +| Element | Nearest Smaller Element | Index of Nearest Smaller Element | +|:-------:|:-----------------------:|:--------------------------------:| +| 8 | NA | -1 | +| 2 | NA | -1 | +| 4 | 2 | 1 | +| 9 | 4 | 2 | +| 7 | 4 | 2 | +| 5 | 4 | 2 | +| 3 | 2 | 1 | +| 10 | 3 | 6 | + +--- +### Question + +Given N array elements, find the nearest smaller element on the left side for all the elements. If there is NO smaller element on left side, return -1. (Assume all elements are positive). + +A = [4, 6, 10, 11, 7, 8, 3, 5] + +**Choices** + +- [ ] [-1, 4, 6, 10, 4, 7, -1, 3] +- [ ] [-1, 4, 6, 10, 6, 6, -1, 3] +- [x] [-1, 4, 6, 10, 6, 7, -1, 3] + + +--- +### Question + +Given N array elements, find the nearest smaller element on the left side for all the elements. If there is NO smaller element on left side, return -1. (Assume all elements are positive). + +A = [4, 5, 2, 10, 8, 2] + +**Choices** + +- [ ] [4, 4, -1, 2, 2, -1] +- [x] [-1, 4, -1, 2, 2, -1] +- [ ] [-1, 4, 4, 2, 2, -1] +- [ ] [-1, 4, 2, 2, 2, 2] + +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Nearest smallest element on left Brute Force + +For each element in the array, iterate through all the elements to its left. + +#### Pseudocode +```java +result[n]; +for (int i = 0; i < n; i++) { + int nearestSmaller = -1; + + for (int j = i - 1; j >= 0; j--) { + if (arr[j] < arr[i]) { + nearestSmaller = j; + break; + } + } + + result[i] = nearestSmaller; +} +return result; +``` + +#### Time Complexity + +This approach has a time complexity of $O(n^2)$ because for each element, it requires checking all elements to its left. It is inefficient for large input arrays. + +--- +### Question + +If A = [8, x, x, x, x, 5, x, x, x, x...] +For any element > 5 can the element 8 become nearest smaller element on left? + +**Choices** + +- [ ] Yes +- [x] No + + +#### Explanation + +Not really since 5 will be the answer for them. + +--- +### Nearest Smallest Element Optimized Approach +#### Observation/Intuition: + +When iterating through the array from left to right, we want to find the nearest smaller element on the left for each element efficiently. +* Using a stack helps us keep track of potential candidates for the nearest smaller element as we move from left to right. The stack stores the indices of elements that have not yet found their nearest smaller element. +* When we encounter a new element, we check if it is smaller than the element at the top of the stack (the most recent candidate for the nearest smaller element). If it is, we know that the element at the top of the stack cannot be the nearest smaller element for any future elements because the new element is closer and smaller. Therefore, we pop elements from the stack until we find an element that is smaller than the current element or until the stack becomes empty. +* The popped elements from the stack are assigned as the nearest smaller elements on the left for the corresponding indices. +* By doing this, we efficiently find the nearest smaller element for each element in the array without the need for nested loops or extensive comparisons, resulting in a linear time complexity of O(n). + + +#### Optimized Approach: + +* Create an empty stack to store the indices of elements. +* Initialize an empty result array with -1 values. +* Iterate through the input array from left to right. +* For each element, while the stack is not empty and the element at the current index is less than or equal to the element at the index stored at the top of the stack, pop elements from the stack and update the result array for those popped elements. +* After the loop, the stack will contain indices of elements that haven't found their nearest smaller element. These elements have no smaller element on the left side. +* The result array will contain the index of the nearest smaller element for all other elements. +* Return the result array. + +--- +### Nearest Smallest Element Optimized Approach Dry Run + + +* Initialize an empty stack and an empty result array of the same length as A filled with -1s. +* Start iterating through the array from left to right: + +| i | Element | Pop index | Stack | Nearest Smaller Element | Push index | +|:---:|:-------:|:---------:|:-----:|:-----------------------:|:----------:| +| 0 | 8 | NIL | EMPTY | NA | 0 | +| 1 | 2 | 0 | EMPTY | NA | 1 | +| 2 | 4 | NIL | 1 | 2 | 2 | +| 3 | 9 | NIL | 1, 2 | 4 | 3 | +| 4 | 7 | 3 | 1, 2 | 4 | 4 | +| 5 | 5 | 4 | 1, 2 | 4 | 5 | +| 6 | 3 | 5, 2 | 1 | 2 | 6 | +| 7 | 10 | NIL | 1, 6 | 3 | 7 | + + +**Code:** + +```java +for (int i = 0; i < n; i++) { + // While the stack is not empty and the element at the current index is less than or + // equal to the element at the index stored at the top of the stack, pop elements from + // the stack and update the result array. + while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) { + stack.pop(); + } + + // If the stack is not empty, the top element's index is the nearest smaller element on the left. + if (!stack.isEmpty()) { + result[i] = stack.peek(); + } + + // Push the current index onto the stack. + stack.push(i); +} + +return result; +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +--- +### Nearest Smallest Element related questions + +### Question-2 + +For all `i`, find nearest smaller or equal element on left + +**ANS:** For this question, we need to change the sign from `<=` to `<` in the above code of the approach in line number 5. + +### Question-3 + +For all `i`, find nearest greater element on left + +**ANS:** For this question, we need to change the sign from `<=` to `>=` in the above code of the approach. + +### Question-4 + +For all `i`, find nearest greater or equal element on left. + +**ANS:** For this question, we need to change the sign from `<=` to `>` in the above code of the approach. + +### Question-5 + +For all `i`, find nearest smaller element on right. + +**ANS:** For this question, the for loop iterates through the input array arr in reverse order (from right to left), and it finds the nearest smaller element on the right for each element using a stack. + +```java +for (int i = n - 1; i >= 0; i--) { + // While the stack is not empty and the element at the current index is less than or + // equal to the element at the index stored at the top of the stack, pop elements from + // the stack and update the result array. + while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) { + stack.pop(); + } + + // If the stack is not empty, the top element's index is the nearest smaller element on the right. + if (!stack.isEmpty()) { + result[i] = stack.peek(); + } + + // Push the current index onto the stack. + stack.push(i); +} + +return result; +``` + +### Question-6 +For all `i`, find nearest smaller or equal element on right. + +**ANS:** For this question, we need to change the sign from `<=` to `>` in the above code of the approach. + +### Question - 7 + +For all `i`, find nearest greater element on right. + +**ANS:** For this question, we need to change the sign from `<=` to `>=` in the above code of the approach. + +### Question-8 + +For all `i`, find the nearest greater or equal element on right. + +**ANS:** For this question, we need to change the sign from `<=` to `>` in the above code of the approach. + + + + +--- +### Problem 2 Largest Rectangle in histogram + + +Given an integer array A, where +A[i] = height of i-th bar. +Width of each bar is = 1. + +Find the area of the largest rectangle formed by continious bars. + + +**Given Array (heights):** [8, 6, 2, 5, 6, 5, 7, 4] + +The goal is to find the largest rectangle that can be formed using continuous bars from this array. In this example, the largest rectangle is formed by bars with heights 5, 6, 5, and 7. The width of each bar is 1, so the area of this rectangle is 5 (height) * 4 (width) = 20. + + + + +Sure, here is a brief MCQ based on finding the largest rectangle formed by continuous bars in an integer array representing bar heights: + +--- +### Question +Find the area of the largest rectangle formed by continious bars. + +bars = [1, 2, 3, 2, 1] + +**Choices** +- [ ] 5 +- [ ] 9 +- [ ] 7 +- [x] 6 +- [ ] 3 + +**Explanation:** + +The largest rectangle is formed from [2, 3, 2] whose contribution is [2, 2, 2] thus the area of the largest rectangle is 6. + + +#### Largest Rectangle Brute Force + +**Brute - Force Approach Pseudo Code:** + +```cpp +function findMaxRectangleArea(hist): + maxArea = 0 + + for i from 0 to len(hist) - 1: + // Consider each bar as a potential starting point + minHeight = hist[i] + + for j from i to len(hist) - 1: + // Iterate through bars to the right + minHeight = min(minHeight, hist[j]) + width = j - i + 1 + area = minHeight * width + maxArea = max(maxArea, area) + + return maxArea +``` + +The brute-force approach involves nested loops and has a time complexity of O(n^2) because it considers all possible combinations of starting and ending points for rectangles. + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +#### Optimized Approch + +**Mathematical Representation:** + +* Let a[i] represent the height of the bar at index i. +* We use j to represent the index of the nearest smaller bar to the left of i. +* Similarly, we use k to represent the index of the nearest smaller bar to the right of i. +* The area of the rectangle that can be formed with the bar at index i as its base is given by `a[i] * (k - j - 1)`. + +**Observation/Intuition:** + +* The key insight here is that for each potential base (represented by indices in the stack), we can efficiently calculate the area of the rectangle by finding the width between the current index and the index at the top of the stack. +* By using a stack, we maintain a list of potential bases and calculate the area of rectangles as we encounter new heights, ensuring we consider all possible rectangles efficiently. + +**Optimized Approach Pseudo Code:** + +```cpp +function findMaxRectangleArea(hist): + stack = [] // Initialize an empty stack to store indices of bars. + maxArea = 0 + + for i from 0 to len(hist) - 1: + while (stack is not empty and hist[i] < hist[stack.top()]): + // Pop elements from the stack and calculate areas + // with their heights as the potential bases. + height = hist[stack.pop()] + width = (i - stack.top() - 1) if stack is not empty else i + area = height * width + maxArea = max(maxArea, area) + + stack.push(i) // Push the current index onto the stack. + + while (stack is not empty): + // Process the remaining elements in the stack. + height = hist[stack.pop()] + width = (len(hist) - stack.top() - 1) if stack is not empty else len(hist) + area = height * width + maxArea = max(maxArea, area) + + return maxArea +``` + + +**Mathematical Representation of the Answer:** + +* The answer (maximum area) is given by the formula: +* $ans ~=~ max(a[i] * (nearest~smaller~right[i] * nearest~smaller~left[i] - 1))$ +* Where a[i] is the height of the bar at index i. +* `nearest_smaller_right[i]` is the index of the nearest smaller bar to the right of i. +* `nearest_smaller_left[i]` is the index of the nearest smaller bar to the left of i. +* We subtract 1 from the product of `nearest_smaller_right[i]` and `nearest_smaller_left[i]` to account for the width of the rectangle. + +--- +### Problem 3 Sum of (Max-Min) of all subarrays + + +Giver an integer array with distinct integers, for all subarrays find (max-min) and return its sum as the answer. + +**Example:** + +Given Array: [2, 5, 3] + +The goal is to find the sum of the differences between the maximum and minimum elements for all possible subarrays. + +* Subarray [2]: Max = 2, Min = 2, Difference = 0 +* Subarray [5]: Max = 5, Min = 5, Difference = 0 +* Subarray [3]: Max = 3, Min = 3, Difference = 0 +* Subarrays of length 2: + * [2, 5]: Max = 5, Min = 2, Difference = 3 + * [5, 3]: Max = 5, Min = 3, Difference = 2 +* Subarray [2, 5, 3]: Max = 5, Min = 2, Difference = 3 + + +The sum of all differences is 0 + 0 + 0 + 3 + 2 + 3 = 8. + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Sum of (Max-Min) of all subarrays Brute force approach +**Brute-Force Approach Pseudo Code:** + +```cpp +function sumOfDifferences(arr): + result = 0 + + for start from 0 to len(arr) - 1: + for end from start to len(arr) - 1: + // Find the maximum and minimum elements within the subarray + maxElement = arr[start] + minElement = arr[start] + + for i from start to end: + maxElement = max(maxElement, arr[i]) + minElement = min(minElement, arr[i]) + + // Calculate the difference between the maximum and minimum elements + difference = maxElement - minElement + + // Add this difference to the result + result += difference + + return result +``` + +#### Complexity +**Time Complexity:** O(N * N) +**Space Complexity:** O(1) + +--- +### Question +Giver an integer array, A with distinct integers, for all subarrays find (max-min) and return its sum as the answer. + +A = [1, 2, 3] + +**Choices** +- [x] 4 +- [ ] 6 +- [ ] 5 +- [ ] 0 + + +#### Explanation: + +The goal is to find the sum of the differences between the maximum and minimum elements for all possible subarrays. + +Subarrays of length 1: +* [1]: Max = 1, Min = 1, Difference = 0 +* [2]: Max = 2, Min = 2, Difference = 0 +* [3]: Max = 3, Min = 3, Difference = 0 + +Subarrays of length 2: +* [1, 2]: Max = 2, Min = 1, Difference = 1 +* [2, 3]: Max = 3, Min = 1, Difference = 1 + +Subarrays of length 3: +* [1, 2, 3]: Max = 3, Min = 1, Difference = 2 + +The sum of all differences is 0 + 0 + 0 + 1 + 1 + 2 = 4. + + +--- +### Sum of (Max-Min) of all subarrays Optimized approach + +#### Optimized Approach + +**Intuition:** + +* The contribution technique eliminates redundant calculations by efficiently counting the number of subarrays in which each element can be the maximum or minimum element. +* By tracking the elements that are greater or smaller than the current element in both directions, we can calculate their contributions to the sum of (max - min) differences without repeatedly considering the same subarrays. + +**Optimized Approach Pseudo code:** + +```cpp +function sumOfDifferences(arr): + n = length of arr + left = new array of size n + right = new array of size n + max_stack = empty stack + min_stack = empty stack + result = 0 + + // Initialize left and right arrays + for i from 0 to n - 1: + left[i] = (i + 1) * (n - i) + right[i] = (i + 1) * (i + 1) + + // Calculate left contributions + for i from 0 to n - 1: + while (not max_stack.isEmpty() and arr[i] > arr[max_stack.top()]): + max_stack.pop() + + if (max_stack.isEmpty()): + left[i] = (i + 1) * (i + 1) + else: + left[i] = (i - max_stack.top()) * (i + 1) + + max_stack.push(i) + + // Calculate right contributions + for i from n - 1 to 0: + while (not min_stack.isEmpty() and arr[i] < arr[min_stack.top()]): + min_stack.pop() + + if (min_stack.isEmpty()): + right[i] = (n - i) * (n - i) + else: + right[i] = (min_stack.top() - i) * (n - i) + + min_stack.push(i) + + // Calculate the sum of (max - min) differences + for i from 0 to n - 1: + contribution = (right[i] * left[i]) * arr[i] + result += contribution + + return result +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) diff --git a/Academy DSA Typed Notes/Advanced/DSA Trees 1 Structure & Traversal.md b/Academy DSA Typed Notes/Advanced/DSA Trees 1 Structure & Traversal.md new file mode 100644 index 0000000..2e1c599 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Trees 1 Structure & Traversal.md @@ -0,0 +1,521 @@ +# Trees 1: Structure & Traversal + +--- +## What is a tree + +Till now, we have seen data structures such as Arrays, Linked Lists, Stacks, Queues... They are **Linear Data Structure** which means we can access them in sequencial order. + +The other category is **Non Linear Data Structure** + +At a lot of places, you must have seen hierarchy - Family, Office, Computer File System, etc. Therefore, there arise a need to be able to store such type of data and process it. + +**Tree is an example of a non/linear or hierarchical data structure.** + + +### Example +Let us see the **hierachy of people in an organization**: +```sql +CEO (Chief Executive Officer) +├── CTO (Chief Technology Officer) +│ ├── Engineering Manager +│ │ ├── Software Development Team Lead +│ │ │ ├── Software Engineer +│ │ │ └── Software Engineer +│ │ └── QA Team Lead +│ │ ├── QA Engineer +│ │ └── QA Engineer +│ └── IT Manager +│ ├── IT Specialist +│ └── IT Specialist +├── CFO (Chief Financial Officer) +│ ├── Finance Manager +│ │ ├── Accountant +│ │ └── Accountant +│ └── Procurement Manager +│ ├── Procurement Officer +│ └── Procurement Officer +└── CMO (Chief Marketing Officer) + ├── Marketing Manager + │ ├── Marketing Specialist + │ └── Marketing Specialist + └── Sales Manager + ├── Sales Representative + └── Sales Representative +``` + +As we know that every tree has roots which are below the leaves but in the computer science the case is different the roots are at the top and leaves below it. + +--- +## Tree naming + +Example +```sql + 1 + / \ + 2 3 + / \ / \ + 4 5 6 7 + / + 8 +``` +* **Node**: An element in a tree that contains data and may have child nodes connected to it. 1, 2, 3, 4, 5, 6, 7, 8. + + + + +* **Root**:
The topmost node in a tree from which all other nodes descend. It has no parent. Node 1 is the root. +* **Parent**:
A node that has child nodes connected to it. Nodes 1, 2, 3 and 7.. +* **Child**:
A node that has a parent node connected to it. Nodes 2, 3, 4, 5, 6, and 7 are children. +* **Leaf**:
A node that has no child nodes. It's a terminal node. Nodes 4, 5, 6, and 8 are leaves. +* **Depth:**
The level at which a node resides in the tree. The root is at depth 0. Depth of node 1 is 0, 2 and 3 are at depth 1, 4, 5, 6, and 7 are at depth 2, and 8 is at depth 3. +* **Height:**
The length of the longest path from a node to a leaf. The height of the tree is the height of the root node. Height of the tree is 3, which is the number of edges from the root to a farthest leaf (8). +* **Subtree**:
A tree structure that is part of a larger tree. Subtree rooted at node 2 consists of nodes 2, 4, and 5. +* **Siblings**:
Nodes that share the same parent node. Nodes 2 and 3 are siblings. +* **Ancestor:**
All nodes from parent to the root node upwards are the ancestors of a node. Nodes 1, 3, 7 are ancestors of node 8. +* **Descendant**:
All nodes from child to the leaf node along that path. Nodes 4 and 5 are descendants of node 2. + + +--- +### Question +Can a leaf node also be a subtree? + +**Choices** +- [x] YES +- [ ] NO +- [ ] Can't say + + + +**Explanation:** + +Yes, a leaf node can also be considered a subtree. A subtree is a portion of a tree structure that is itself a tree. + +--- +### Question +Do all nodes have a parent node? + +**Choices** +- [ ] YES +- [x] NO +- [ ] Can't say + + +**Explanation:** + +In a tree data structure, all nodes except for the root node have a parent node. + +--- +### Levels of a tree + + +```sql + 1 Level 0 + / \ + 2 3 Level 1 + / \ +4 5 Level 2 +``` +In this example: + +* **Level 0:** Node 1 is at level 0 (root level). +* **Level 1:** Nodes 2 and 3 are at level 1. +* **Level 2:** Nodes 4 and 5 are at level 2. + +--- +### Question +What is the height of the leaf node in any tree? + + +**Choices** +- [x] 0 +- [ ] 1 +- [ ] 2 +- [ ] 3 + + +**Explanation** + +The height of a leaf node in any tree, including a binary tree, is 0. This is because the height of a node is defined as the length of the longest path from that node to a leaf node, and a leaf node is a node that doesn't have any children. Since there are no edges to traverse from a leaf node to a leaf node, the length of the path is 0. + +--- + +### Binary Tree + +A type of tree in which each node can have at most two children i.e, either 0, 1 or 2, referred to as the left child and the right child. + +**Example of a binary tree:** +```sql + 10 + / \ + 5 15 + / \ / \ + 3 8 12 18 +``` + +--- +### Traversals in a Tree + + +### How can we traverse a Tree ? + +There are many ways to traverse the tree. + +**L:** Left Subtree, **R:** Right Subtree, **N:** Root Node + +| L N R | L R N | R N L | +|:---------:|:---------:|:---------:| +| **R L N** | **N L R** | **N R L** | + +Having so many traversals can be confusing and are unnecessary. Threfore, a standard has been set where first we'll always consider the Left Subtree and then the Right Subtree. +Therefore, we boil down to 3 traverals. + + + +| L N R | **Named as Inorder** | +|:---------:|:----------------------:| +| **N L R** | **Named as Preorder** | +| **L R N** | **Named as Postorder** | + +Names are given w.r.t the position of the root node. + +> There are more techniques for traversing a tree that'll be covered in next set of sessions. + +#### Pre-order +Pre-order traversal is a depth-first traversal technique used to visit all nodes of a binary tree in a specific order. In pre-order traversal, you start from the root node and follow these steps for each node: +1. Visit the current node. +2. Traverse the left subtree (recursively). +3. Traverse the right subtree (recursively). + +**This traversal order ensures that the root node is visited before its children and the left subtree is explored before the right subtree.** + +**Example:** +```sql + 10 + / \ + 5 15 + / \ / \ + 3 8 12 18 +``` +Pre-order traversal sequence: 10, 5, 3, 8, 15, 12, 18 + +#### Pseudocode +```cpp +void preorder(root) { + if (root == null) + return; + + print(root.data); //node + preorder(root.left); //left + preorder(root.right) //right +} +``` +#### In-order traversal +In-order traversal is another depth-first traversal technique used to visit all nodes of a binary tree, but in a specific order. In in-order traversal, you follow these steps for each node: + +1. Traverse the left subtree (recursively). +2. Visit the current node. +3. Traverse the right subtree (recursively). + +**This traversal order ensures that nodes are visited in ascending order if the binary tree represents a search tree.** + +Here's an example of in-order traversal on a binary tree: +```cpp + 10 + / \ + 5 15 + / \ / \ + 3 8 12 18 +``` +In-order traversal sequence: 3, 5, 8, 10, 12, 15, 18 + +#### Pseudocode +```cpp +void inorder(root) { + if (root == null) + return; + + inorder(root.left); //left + print(root.data); //node + inorder(root.right) //right +} +``` +#### Post-order Traversal +Post-order traversal is another depth-first traversal technique used to visit all nodes of a binary tree, but in a specific order. In post-order traversal, you follow these steps for each node: + +1. Traverse the left subtree (recursively). +2. Traverse the right subtree (recursively). +3. Visit the current node. + +**This traversal order ensures that nodes are visited from the bottom up, starting from the leaf nodes and moving towards the root node.** + +**Example** +```cpp + 10 + / \ + 5 15 + / \ / \ + 3 8 12 18 +``` +Post-order traversal sequence: 3, 8, 5, 12, 18, 15, 10 + +#### Pseudocode: +```cpp +void postorder(root) { + if (root = null) return; + postorder(root.left) left + postorder(root.right) right + print(root.data) Node +} +``` + +--- +### Question +What is the inorder traversal sequence of the below tree? +```cpp + 1 + / \ + 2 4 + / / \ + 3 5 6 +``` +**Choices** +- [ ] [1, 2, 3, 4, 5, 6] +- [x] [3, 2, 1, 5, 4, 6] +- [ ] [3, 2, 1, 4, 5, 6] +- [ ] [4, 5, 6, 1, 2, 3] + + + +**Explanation** + +The inorder traversal sequence is [3, 2, 1, 5, 4, 6]. + + +--- +### Iterative Inorder traversal + + +### Approach: +* Iterative Inorder traversal is a method to visit all the nodes in a binary tree in a specific order without using recursion. +* In the case of Inorder traversal, you visit the nodes in the following order: left subtree, current node, right subtree. +* Here's how you can perform an iterative Inorder traversal using a stack data structure, along with an example: + +Let's say we have the following binary tree as an example: +```cpp + 1 + / \ + 2 3 + / \ + 4 5 +``` +#### Dry-Run: +* Start at the root node (1). +* Push 1 onto the stack and move left to node 2. +* Push 2 onto the stack and move left to node 4. +* Push 4 onto the stack and move left; there are no left children, so pop 4, visit it, and move right (which is null). +* Pop 2, visit it, and move to its right child, node 5. +* Push 5 onto the stack and move left; there are no left children, so pop 5, visit it, and move right (which is null). +* Pop 1, visit it, and move to its right child, node 3. +* Push 3 onto the stack and move left; there are no left children, so pop 3, visit it, and move right (which is null). +* The stack is empty, and all nodes have been visited. +* So, the iterative Inorder traversal of the tree is 4, 2, 5, 1, 3. + +#### Need of recursion/stack: +In inorder traversal of a binary tree, you need a data structure like a stack or recursion because you need to keep track of the order in which you visit the nodes of the tree. The reason for using these techniques is to handle the backtracking that's inherent in traversing a binary tree in inorder fashion. In a binary tree's inorder traversal, you visit nodes in a specific order: left, current, right. You use a stack or recursion to remember where you left off in the tree when moving between nodes, ensuring you visit nodes in the correct order and navigate through the tree efficiently. This backtracking is essential for proper traversal. + +#### Pseudocode: +```cpp +cur = root; +while (cur != null || st.isempty()) { + if (cur != null) { + st.push(curr) + cur = cur.left; + } else { + cur = st.pop(); + print(cur.data) + cur = cur.right + } +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +--- + +### Construct binary tree from inorder and post order + +Constructing a binary tree from its inorder and postorder traversals involves a recursive process. Here's a brief explanation with an example: + + + +#### Brute-Force Approach + + +* Generate all possible permutations of the given inorder traversal. +* For each permutation, check if it forms a valid binary tree when combined with the given postorder traversal. +* Return the first valid binary tree found. + +**Example:** +Inorder: [4, 2, 7, 5, 1, 3, 6] +Postorder: [4, 7, 5, 2, 6, 3, 1] + +#### Dry-Run: +* Identify the root: In the postorder traversal, the last element is 1, which is the root of the binary tree. +* Split into left and right subtrees: In the inorder traversal, find the position of the root element (1). Elements to the left of this position represent the left subtree, and elements to the right represent the right subtree. +* Recurse on left subtree: For the left subtree, the root is 2 (found in postorder traversal). Split the left subtree's inorder and postorder traversals, and repeat the process. +* Recurse on right subtree: For the right subtree, the root is 3 (found in postorder traversal). Split the right subtree's inorder and postorder traversals, and repeat the process. +* Continue the recursion: Repeat steps 3 and 4 for each subtree until the entire binary tree is constructed. + + +#### Pseudocode: +```cpp +function buildTreeBruteForce(inorder, postorder): + for each permutation of inorder: + if formsValidBinaryTree(permutation, postorder): + return constructBinaryTree(permutation, postorder) + return null +``` + +#### Complexity +**Time Complexity:** O(N! * N) +**Space Complexity:** O(N) + +--- + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +### Most-Optimised Approach: + +* The last element in the postorder traversal is the root of the binary tree. +* Find the root element in the inorder traversal to determine the left and right subtrees. +* Recursively repeat the process for the left and right subtrees. + + + +Now as we can see in the above image let us understand this with the help of a dry/run: + +#### Dry-Run/Example: +inorder={4,2,7,5,1,3,6} and postorder={4,7,5,2,6,3,1} + +1. The last element in the postorder traversal is 1, which is the root of the binary tree. + +Binary Tree: +```plaintext +1 +``` +2. Find 1 in the inorder traversal to split it into left and right subtrees. The elements to the left are the left subtree, and the elements to the right are the right subtree. + +```cpp +Inorder: [4,2,7,5,1,3,6] +Postorder: [4,7,5,2,6,3,1] +``` + +Left Subtree (Inorder: [4,2,7,5], Postorder: [4,7,5,2]): + +```cpp + 1 + / +2 + \ + 5 + / \ +4 7 +``` +Right Subtree (Inorder: [3,6], Postorder: [6,3]): + +```cpp +6 + \ + 3 +``` +3. Repeat the process for the left and right subtrees: + +For the left subtree: +* The last element in the postorder traversal is 2, which is the root of the left subtree. +* Find 2 in the inorder traversal to split it into left and right subtrees. +* Left Subtree (Inorder: [4], Postorder: [4]): +```cpp + 2 + / +4 +``` +Right Subtree (Inorder: [7,5], Postorder: [7,5]): +```cpp + 5 + / +7 +``` +For the right subtree: + +* The last element in the postorder traversal is 3, which is the root of the right subtree. +* Find 3 in the inorder traversal to split it into left and right subtrees. +* Left Subtree (Inorder: [6], Postorder: [6]): +```cpp + 3 + \ + 6 +``` + +The final binary tree would look like this: +```cpp + 1 + / \ + 2 3 + / \ \ + 4 5 6 + / + 7 +``` + +--- +### Question +The inorder traversal sequence `[4, 2, 5, 1, 6, 3]` and the postorder traversal sequence `[4, 5, 2, 6, 3, 1]`. What is the root of the binary tree? + +**Choices** +- [x] 1 +- [ ] 2 +- [ ] 3 +- [ ] 4 + + +**Explanation:** + +In postorder traversal, the last element is always the root of the tree, so here, 1 is the root. + + +--- +### Construct binary tree Pseudocode +#### Pseudocode: +* rootIndex is the index of the root value in the inorder array. +* rootIndex + 1 represents the start of the right subtree in the arrays. +* end represents the end of the right subtree in the arrays. +* start represents the start of the left subtree in the arrays. +* rootIndex - 1 represents the end of the left subtree in the arrays. +```cpp +function buildTree(inorder, postorder): + if postorder is empty: + return null + + // The last element in postorder is the root of the current subtree + rootValue = postorder.last + root = new TreeNode(rootValue) + + // Find the index of the rootValue in inorder to split it into left and right subtrees + rootIndex = indexOf(inorder, rootValue) + + // Recursive call for right subtree + root.right = buildTree(subarray(inorder, rootIndex + 1, end), subarray(postorder, rootIndex, end - 1)) + + // Recursive call for left subtree + root.left = buildTree(subarray(inorder, start, rootIndex - 1), subarray(postorder, start, rootIndex - 1)) + + return root +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) diff --git a/Academy DSA Typed Notes/Advanced/DSA Trees 2 Views & Types.md b/Academy DSA Typed Notes/Advanced/DSA Trees 2 Views & Types.md new file mode 100644 index 0000000..2a5f69e --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Trees 2 Views & Types.md @@ -0,0 +1,601 @@ +# Advanced DSA : Trees 2: Views & Types + +--- +## Level Order Traversal +Input: 1, 2, 3, 5, 8, 10, 13, 6, 9, 7, 4, 12, 11. + +The diagram for the following nodes will be: + + + + +```cpp +1 +2 3 +5 8 10 13 +6 9 7 4 +12 11 +``` + + +--- +### Question +Will the last level node always be a leaf node? + +**Choices** +- [x] YES +- [ ] NO +- [ ] Cant say + + + +**Explanation** + +Yes, in the context of a binary tree's right view, the last level node will always be a leaf node. This is because the right view of a binary tree focuses on the rightmost nodes at each level as seen from a top-down view. + + +--- +### Question +Which traversal is best to print the nodes from top to bottom? + +**Choices** +- [x] Level order traversal +- [ ] Pre order +- [ ] post order + + + +**Explanation:** + +When you want to print nodes from top to bottom, the level-order traversal, also known as Breadth-First Search (BFS), is the best choice. Level-order traversal ensures that nodes at the same level are processed before moving to the next level. This results in a top-to-bottom exploration of the tree. + +--- +### Level order traversal Observations + + +#### Observations: +* Level order traversal visits nodes level by level, starting from the root. +* It uses a queue to keep track of the nodes to be processed. +* Nodes at the same level are processed before moving on to the next level. +* This traversal ensures that nodes at higher levels are visited before nodes at lower levels. + +Since this will be done level by level hence we will be requiring a queue data structure to solve this problem: + + + +After the whole process the queue data strucutre will look somewhat like this: + + + +Like this(in theabove example) it will be done for all of the nodes. +Let us see the pseudocde to solve the problem in printing in one line only: + +#### Pseudocode: + +```cpp +q.enqueue(root) { + while (!q.eempty()) { + x = q.dequeue() + print(x.data) + if (x.left != null) q.enqueue(x.left) + if (x.right != null) q.enqueue(x.right) + } +} +``` +Each level will be printed in seperate line: +```cpp +1 +2 3 +5 8 10 13 +6 9 7 4 +12 11 +``` + + +#### Observations: + +* Level order traversal prints nodes at the same depth before moving to the next level, ensuring that nodes on the same level are printed on separate lines. + +#### Approach: +1. Start with the root node and enqueue it. +2. Initialize last as the root. +3. While the queue is not empty: + * Dequeue a node, print its data. + * Enqueue its children (if any). + * If the dequeued node is the same as last, print a newline and update last. + +#### Dry-Run: +```cpp + 1 + / \ + 2 3 + / \ + 4 5 +``` +* Enqueue root node 1 and initialize last as 1. +* Dequeue 1 and print it. Enqueue its children 2 and 3. +* Dequeue 2 and print it. Enqueue its children 4 and 5. +* Dequeue 3 and print it. Since 3 is the last node in the current level, print a newline. +* Dequeue 4 and print it. There are no children to enqueue for 4. +* Dequeue 5 and print it. There are no children to enqueue for 5. + +**Final Output:** +```plaintext +1 +2 +3 +4 +5 +``` + + + +Let us see the pseudocode to solve the problem in printing in **seperate** line only: + +#### Pseudocode: + +```cpp +q.enqueue(root) { + last = root; + while (!q.empty()) { + x.dequeue() + print(x.data) + if (x.left != null) q.enqueue(x.left) + if (x.right != null) q.enqueue(x.right) + if (x == last && !q.empty()) { + print("\n"); + last = q.rear(); + } + } +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +--- +### Problem 2 Right and left view + + +### Example: +Let us see an example below: +```cpp + 1 + / \ + 2 3 + / \ \ + 4 5 6 + \ + 7 +``` +The right view of this tree would be [1, 3, 6, 7] when viewed from the right side. + +To solve this we need to print last node of every level. + + +--- +### Question +Print right view of the given binary tree, + +```cpp + 1 + / \ + 2 3 + \ \ + 5 6 + / \ + 8 7 + / \ + 9 10 +``` + +**Choices** +- [ ] [1, 3, 6, 7] +- [ ] [1, 3, 6, 8, 9] +- [ ] [1, 3, 6, 7, 8, 9, 10] +- [x] [1, 3, 6, 7, 10] +- [ ] [1, 2, 5] + + +--- +### Right view Observations + +#### Observations/Idea + +* The idea behind obtaining the right view of a binary tree is to perform a level-order traversal, and for each level, identify and print the rightmost node. This process ensures that we capture the rightmost nodes at each level, giving us the right view of the binary tree. We can obtain the right-view of the tree using a breadth-first level-order traversal with a queue and a loop. + + +#### Approach: +1. Initialize an empty queue for level order traversal and enqueue the root node. +2. While the queue is not empty, do the following: + * Get the number of nodes at the current level (levelSize) by checking the queue's size. + * Iterate through the nodes at the current level. + * If the current node is the rightmost node at the current level, print its value. + * Enqueue the left and right children of the current node if they exist. + * Repeat this process until the queue is empty. + +Let us see the pseudocode to solve the problem: + +#### Pseudocode: +```cpp +q.enqueue(root) +last = root; +while (!q.empty(1)) { + x = q.dequeue() + if (x.left != null) q.enqueue(x.left) + if (x.right != null) q.enqueue(x.right) + if (x == last) { + print(x.data) + if (!q.empty()) { + print("\n"); + last = q.rear(); + } + + } +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(M) + +--- +### Vertical Order traversal + +**Examples:** +Consider the following binary tree: +```cpp + 1 + / \ + 2 3 + / \ / \ + 4 5 6 7 + / \ + 8 9 +``` +Vertical order traversal of this tree would yield the following output: +```cpp +Vertical Line 1: 4 +Vertical Line 2: 2, 8 +Vertical Line 3: 1, 5, 6 +Vertical Line 4: 3, 9 +Vertical Line 5: 7 +``` + +We need to print the vertical lines from top to bottom. + + +--- +### Question +Consider the following binary tree: +```cpp + 1 + / \ + 2 3 + \ \ + 5 6 + / \ + 8 7 + / \ + 9 10 +``` + +Pick the vertical order traversal of the given Binary Tree. + +**Choices** +- [x] [2, 1, 5, 9, 3, 8, 6, 10, 7] +- [ ] [1, 2, 5, 3, 6, 8 ,9, 10, 7] +- [ ] [1, 2, 3, 5, 6, 8, 7, 9, 10] +- [ ] [1, 5, 2, 3, 6, 10, 8, 7, 9] + +**Explanation:** + +Vertical order traversal of this tree would yield the following output: +```cpp +Vertical Line 1: 2 +Vertical Line 2: 1, 5, 9 +Vertical Line 3: 3, 8 +Vertical Line 4: 6, 10 +Vertical Line 5: 7 +``` + + +--- +### Vertical Order traversal Observations +#### Observation: +* Vertical order traversal of a binary tree prints nodes column by column, with nodes in the same column printed together. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +These are the steps to Print vertical order traversal: +#### Approach: +* Assign horizontal distances to nodes (root gets distance 0, left decreases by 1, right increases by 1). +* Create a map/hash table where keys are distances and values are lists of node values. +* Update the map while traversing: append node values to corresponding distance lists. +* After traversal, print the values from the map in ascending order of distances. + + +--- +### Vertical Order traversal Pseudocode +#### Pseudocode + +Let us see the pseudocode to solve this: +```cpp +procedure levelOrderTraversal(root) + if root is null + return + + Create a queue + Enqueue root + + while queue is not empty + currentNode = dequeue a node from the queue + print currentNode's value + + if currentNode has left child + enqueue left child + end if + + if currentNode has right child + enqueue right child + end if + end while +end procedure +``` + +--- +### Problem 4 Top View + +**Example:** +Consider the following binary tree: +```cpp + 1 + / \ + 2 3 + / \ / \ + 4 5 6 7 +``` +The top view of this tree would be [4, 2, 1, 3, 7]. + + +--- +### Question +Consider the following binary tree: +```cpp + 1 + / \ + 2 3 + \ \ + 5 6 + / \ + 8 9 +``` + +What is the top view of the given binary tree. + +**Choices** +- [ ] [5, 2, 1, 3, 6, 9] +- [ ] [8, 5, 2, 1, 3, 6, 9] +- [ ] [2, 1, 5, 3, 8, 6, 9] +- [x] [2, 1, 3, 6, 9] + + +**Explanation:** + +The Top view of the Given Binary tree is [2, 1, 3, 6, 9]. + + +--- +### Top View Observations + +#### Observations: +* Assign Horizontal Distances: Nodes are assigned horizontal distances, with the root at distance 0, left children decreasing by 1, and right children increasing by 1. This helps identify the nodes in the top view efficiently. + +#### Approach: +For this we need to follow these steps: +* Traverse the binary tree. +* Maintain a map of horizontal distances and corresponding nodes. +* Only store the first node encountered at each unique distance. +* Print the stored nodes in ascending order of distances to get the top view. + +#### Pseudocode: +```cpp +procedure topView(root) + if root is null + return + + Create an empty map + + Queue: enqueue (root, horizontal distance 0) + + while queue is not empty + (currentNode, currentDistance) = dequeue a node + + if currentDistance is not in the map + add currentDistance and currentNode's value to map + + enqueue (currentNode's left child, currentDistance - 1) if left child exists + enqueue (currentNode's right child, currentDistance + 1) if right child exists + + Print values in map sorted by keys +end procedure + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(W) + +--- +### Types of binary tree + + + +1. **Proper Binary Tree (Strict Binary Tree):** +Every node has either 0 or 2 children (never 1 child). +Diagram: +```cpp + A + / \ + B C +/ \ / \ +``` +2. **Complete Binary Tree:** +All levels are filled except possibly the last level, which is filled left to right. +Diagram: +```cpp + A + / \ + B C +/ \ / +``` +3. **Perfect Binary Tree:** +All internal nodes have exactly two children, and all leaf nodes are at the same level. +Diagram: +```cpp + A + / \ + B C +/ \ / \ +``` + + +--- +### Question +Perfect Binary Trees are also: + +**Choices** +- [ ] Proper binary tree +- [ ] Complete binary tree +- [x] both +- [ ] none + + +**Explanation:** + +A perfect binary tree is a specialized case of both a proper binary tree and a complete binary tree, where all internal nodes have two children, all leaf nodes are at the same level, and all levels are completely filled. + +--- +### Problem 5 : Check height balanced tree + +### Definition +For all nodes if(`height_ofleftchild-height_ofrightchild`) <= 1 + +**Example:** +```cpp + 1 + / \ + 2 3 + / \ + 4 5 + / + 6 +``` +This tree is not height-balanced because the left subtree of node 2 has a height of 3, while the right subtree of node 2 has a height of 0, and the difference is greater than 1. + +:::warning +Please take some time to think about the brute force approach on your own before reading further..... +::: + +### Brute Force +#### Approach +* For each node in the binary tree, calculate the height of its left and right subtrees. +* Check if the absolute difference between the heights of the left and right subtrees for each node is less than or equal to 1. +* If step 2 is true for all nodes in the tree, the tree is height-balanced. + + +#### Pseudocode: +```cpp +// Helper function to calculate the height of a tree +function calculateHeight(root): + if root is null: + return -1 + return 1 + max(calculateHeight(root.left), calculateHeight(root.right)) + +function isHeightBalanced(node): + if node is null: + return true // An empty tree is height-balanced + + // Check if the current node's subtrees are height-balanced + leftHeight = calculateHeight(node.left) + rightHeight = calculateHeight(node.right) + + // Check if the current node is height-balanced + if abs(leftHeight - rightHeight) > 1: + return false + + // Recursively check the left and right subtrees + return isHeightBalanced(node.left) && isHeightBalanced(node.right) + +// Example usage: +root = buildTree() // Build your binary tree +result = isHeightBalanced(root) +``` + +> NOTE: For a null node: **height = -1** + + +#### Complexity +**Time Complexity:** $O(N^2)$ +**Space Complexity:** O(N) + +--- +### Question +Which traversal is best to use when finding the height of the tree? + +**Choices** +- [ ] Level order +- [ ] Inorder +- [x] postorder +- [ ] preorder + + +**Explanation:** + +Postorder traversal works best for calculating the height of a tree because it considers the height of subtrees before calculating the height of parent nodes, which mirrors the hierarchical nature of tree height calculation. + +--- +### Check height balanced tree Optimised Approach + +#### Observation/Idea: +* To solve the problem of determining whether a binary tree is height-balanced we can consider using a recursive approach where you calculate the height of left and right subtrees and check their balance condition at each step. Keep track of a boolean flag to indicate whether the tree is still balanced. + +#### Approach: +* We use a helper function height(root) to calculate the height of each subtree starting from the root. +* In the height function: +* If the root is null (i.e., an empty subtree), we return -1 to indicate a height of -1. +* We recursively calculate the heights of the left and right subtrees using the height function. +* We check if the absolute difference between the left and right subtree heights is greater than 1. If it is, we set the ishb flag to false, indicating that the tree is not height-balanced. +* We return the maximum of the left and right subtree heights plus 1, which represents the height of the current subtree. +* The ishb flag is initially set to true, and we start the height calculation from the root of the tree. +* If, at any point, the ishb flag becomes false, we know that the tree is not height-balanced, and we can stop further calculations. +* After the traversal is complete, if the ishb flag is still true, the tree is height-balanced. + +#### Example: +```cpp + 1 + / \ + 2 3 + / \ + 4 5 +``` +This tree is height-balanced because the height of the left and right subtrees of every node differs by at most 1. + +#### Pseudocode +```cpp +int height(root, ishb) { + if (root == null) return -1; + l = height(root.left) + r = height(root.right) + if (abs(l - r) > 1) ishb = false; + return max(l, r) + 1 +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(log N) + diff --git a/Academy DSA Typed Notes/Advanced/DSA Trees 3 BST.md b/Academy DSA Typed Notes/Advanced/DSA Trees 3 BST.md new file mode 100644 index 0000000..543a0ca --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Trees 3 BST.md @@ -0,0 +1,484 @@ +# Advanced DSA : Trees 3: BST + +--- +## Binary Search Tree + +Binary search tree is searching data in an organized dataset using divide and conquer. + +For a node X in a binary search tree everything on the left has data less than x and on the right greater than x. + + + +Example of a binary search tree: + +```cpp + 5 + / \ + 3 8 + /\ /\ + 1 4 6 9 +``` + +--- +### Question +What is a Binary Search Tree (BST)? + + +**Choices** +- [ ] A tree with only two nodes +- [ ] A tree where the left child of a node has a value <= the node, and the right child has a value > the node +- [x] A tree where for a node x, everything on the left has data <= x and on the right > x. +- [ ] A tree that has height log N. + + + +--- +### Problem 1 Searching in Binary Search Tree + +Searching in a Binary Search Tree (BST) involves utilizing the property that values in the left subtree are smaller and values in the right subtree are larger than the current node's value. This property allows for efficient search operations. +Here's an example using the BST diagram from earlier: +```cpp + 5 + / \ + 3 8 + /\ /\ + 1 4 6 9 +``` +**Suppose you're searching for the value 6:** + +* Start at the root (value 5). +* Compare 6 with 5. Since 6 is greater, move to the right child (value 8). +* Compare 6 with 8. Since 6 is smaller, move to the left child (value 6). +* The value 6 matches the current node's value, so the search is successful. + +--- +### Question +What is the number of nodes you need to visit to find the number `1` in the following BST? + +```cpp + 5 + / \ + 3 8 + /\ /\ + 1 4 6 9 +``` + +**Choices** +- [ ] 2 +- [x] 3 +- [ ] 4 +- [ ] 1 + + +**Explanation** +First node: 5. From 5 you move left. +Second node: 3. From 3 you move left, again. +Third node: 1. You finally get 1. + +--- +### Searching in Binary Search Tree Pseudo Code + +#### Pseudo Code +```cpp +function search(root, target): + if root is None: + return None + + if root.value == target: + return root + + if target < root.value: + return search(root.left, target) + + if target > root.value: + return search(root.right, target) +``` + + +--- +### Problem 2 Insertion in Binary Search Tree + + +### Insertion in BST: +Inserting a new value into a Binary Search Tree (BST) involves maintaining the property that values in the left subtree are smaller and values in the right subtree are larger than the current node's value. + +Here's an example using the BST diagram from earlier: +```cpp + 5 + / \ + 3 8 + /\ /\ + 1 4 6 9 +``` +**Suppose you want to insert the value 7:** + +* Start at the root (value 5). +* Compare 7 with 5. Since 7 is greater, move to the right child (value 8). +* Compare 7 with 8. Since 7 is smaller, move to the left child (value 6). +* Compare 7 with 6. Since 7 is greater, move to the right child (null). +* Insert the value 7 as the right child of the node with value 6. + +The updated tree after insertion: +```cpp + 5 + / \ + 3 8 + /\ /\ + 1 4 6 9 + \ + 7 +``` + +#### Pseudocode: +```cpp +function insert(root, value): + if root is null: + return createNode(value) + + if value < root.value: + root.left = insert(root.left, value) + else: + root.right = insert(root.right, value) + + return root +``` + +--- +### Question +Where does the node with the smallest value resides in a BST? + +**Choices** +- [x] We keep on going left and we get the smallest one. +- [ ] Depends on the tree. +- [ ] We keep on going right and we get the smallest one. +- [ ] The root node. + + + +For every node, we need to go to its left, that's the only way we can reach the smallest one. + +--- +### Problem 3 Find smallest in Binary Search Tree + +Find smallest in Binary Search Tree + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Approach** + +The left most node in the tree, will be the smallest. + +**Example:** +Suppose we have the following BST: +```cpp + 5 + / \ + 3 8 + / \ \ + 2 4 9 +``` +To find the smallest element: + +* Start at the root node (5). +* Move to the left child (3). +* Continue moving to the left child until you reach a node with no left child. +* The node with no left child is the smallest element in the BST. In this case, it's the node with the value 2. +* So, in this example, the smallest element in the BST is 2. + +#### Pseudocode + +```cpp +temp = root // not null +while (temp.left != null) { + temp = temp.left +} +return temp.data; +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + +--- +### Problem 4 Find largest in Binary Search Tree +#### Approach + +The right most node in the tree, will be the largest. + +**Example:** +Suppose we have the following BST: +```cpp + 5 + / \ + 3 8 + / \ \ + 2 4 9 +``` +* To find the largest element: +* Start at the root node (5). +* Move to the right child (8). +* Continue moving to the right child until you reach a node with no right child. +* The node with no right child is the largest element in the BST. In this case, it's the node with the value 9. +* So, in this example, the largest element in the BST is 9. + +#### Pseudocode + +```cpp +temp = root // not null +while (temp.right != null) { + temp = temp.right +} +return temp.data; +``` + +--- +### Problem 5 Deletion in Binary Search Tree + +Deleting a node from a Binary Search Tree (BST) involves maintaining the BST property while handling various cases depending on the node's structure. Here's how the deletion process works: + +* Find the Node to Delete: Start at the root and traverse the tree to find the node you want to delete. Remember to keep track of the parent node as well. + +#### Case 1: Node with No Children (Leaf Node) +In this case, we have a node with no children (a leaf node). Deleting it is straightforward; we simply remove it from the tree. + +**Example:** +Suppose we have the following BST, and we want to delete the node with the value 7. +```cpp + 10 + / \ + 5 15 + / \ / \ + 3 7 12 18 +``` +After deleting the node with the value 7, the tree becomes: +```cpp + 10 + / \ + 5 15 + / / \ + 3 12 18 +``` +#### Case 2: Node with One Child +In this case, the node to be deleted has only one child. To delete it, we replace the node with its child. + +**Example:** +Suppose we have the following BST, and we want to delete the node with the value 5. +```cpp + 10 + / \ + 5 15 + / / \ + 3 12 18 +``` +After deleting the node with the value 5, we replace it with its child (3): +```cpp + 10 + / \ + 3 15 + / \ + 12 18 +``` + + +#### Case 3: Node with Two Children +In this case, the node to be deleted has two children. To delete it, we find either the in-order predecessor or successor and replace the node's value with the value of the predecessor or successor. Then, we recursively delete the predecessor or successor. + +**Example:** +Suppose we have the following BST, and we want to delete the node with the value 10 (which has two children). +```cpp + 10 + / \ + 5 15 + / \ / \ + 3 9 12 18 +``` +To delete the node with value 10, we can either choose its in-order predecessor (9) or in-order successor (12). Let's choose the in-order predecessor (9): + +* Find the in-order predecessor (the largest value in the left subtree). In this case, it's 9. +* Replace the value of the node to be deleted (10) with the value of the in-order predecessor (9). +* Recursively delete the in-order predecessor (9), which falls into either Case 1 (no children) or Case 2 (one child). +* After deleting the node with the value 10, the tree becomes: +```cpp + 9 + / \ + 5 15 + / / \ + 3 12 18 +``` +These are the three main cases for deleting a node in a Binary Search Tree (BST). + +#### Pseudo Code +Here's the pseudo code with each of the cases mentioned. + + +### Question +What is the purpose of balancing a Binary Search Tree? + +**Choices** +- [ ] To make it visually appealing +- [ ] To ensure all nodes have the same value +- [x] To maintain efficient search, insert, and delete operations +- [ ] Balancing is not necessary in a Binary Search Tree + + +--- +### Problem 6 Construct a binary search tree + + +#### Approach: +* Find the middle element of the sorted array. +* Create a new node with this middle element as the root of the tree. +* Recursively repeat steps 1 and 2 for the left and right halves of the array, making the middle element of each subarray the root of its respective subtree. +* Continue this process until all elements are processed. +* The final tree will be a valid BST with the given sorted array as its inorder traversal. +* Here's an example construction of a BST using the values 8, 3, 10, 1, 6, 14, 4, 7, and 13: + +#### Example: +* Sorted Array - 1, 3, 4, 6, 7, 8, 10, 13, 14 +* Create the root node with value 8. +* Insert 3: Move to the left child of the root (value 3). +* Insert 10: Move to the right child of the root (value 10). +* Insert 1: Move to the left child of the node with value 3 (value 1). +* Insert 6: Move to the right child of the node with value 3 (value 6). +* Insert 14: Move to the right child of the root (value 14). +* Insert 4: Move to the left child of the node with value 6 (value 4). +* Insert 7: Move to the right child of the node with value 6 (value 7). +* Insert 13: Move to the left child of the node with value 14 (value 13). +The constructed BST: +```cpp + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / \ / + 4 7 13 +``` + + +#### Pseudocode: + +```cpp +function insert(root, value): + if root is null: + return [value, null, null] + + if value < root[0]: + root[1] = insert(root[1], value) + else: + root[2] = insert(root[2], value) + + return root + +// Construct a BST by inserting values +root = null +values = [8, 3, 10, 1, 6, 14, 4, 7, 13] +for each value in values: + root = insert(root, value) +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(logn) + +--- +### Problem 7 Check if a binary tree is a binary search tree + +To check if a binary tree is a binary search tree (BST), you can perform an inorder traversal of the tree and ensure that the values encountered during the traversal are in ascending order. Here's how you can do it: + +**Conditions are:** + + + + +#### Approach: +* Perform an inorder traversal of the binary tree. +* During the traversal, keep track of the previously visited node's value. +* At each step, compare the current node's value with the previously visited node's value. +* If the current node's value is less than or equal to the previously visited node's value, the tree is not a BST. +* If you complete the entire traversal without encountering any violations of the BST property, the tree is a BST. + + + +**Example:** +Suppose we have the following binary tree: +```cpp + 4 + / \ + 2 6 + / \ / \ + 1 3 5 7 +``` +* Initialize prevValue as -∞ (negative infinity). +* Begin the inorder traversal: +* Start at the root node (4). +* Recursively traverse the left subtree (node 2). +* Check 2 > -∞, so it's okay. +* Update prevValue to 2. +* Recursively traverse the left subtree (node 1). +* Check 1 > 2. This is a violation. +* Since there's a violation, the tree is not a BST. + +--- +### Question +Check where the given binary tree is a Binary Search Tree. + +```cpp + 5 + / \ + 2 6 + / \ / \ + 1 3 4 7 +``` + +**Choices** +- [ ] Yes, It is a Binary Search Tree +- [x] No, It is not a Binary Search Tree +- [ ] May be +- [ ] Not sure + + +**Explanation:** + +No, It is not a Binary Search Tree. + +The node with the value 4 should not be on the right sub of the root node, since the root is 5, the node has to be placed on left subtree. + +--- + + +### Pseudocode: +```cpp +function isBST(root): + // Initialize a variable to keep track of the previously visited node's value + prevValue = -infinity // A small negative value + + // Helper function for the inorder traversal + function inorderTraversal(node): + if node is null: + return true // Reached the end of the subtree, no violations + + // Recursively traverse the left subtree + if not inorderTraversal(node.left): + return false + + // Check if the current node's value violates the BST property + if node.value <= prevValue: + return false + + // Update the previously visited node's value + prevValue = node.value + + // Recursively traverse the right subtree + return inorderTraversal(node.right) + + // Start the inorder traversal from the root + return inorderTraversal(root) +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) \ No newline at end of file diff --git a/Academy DSA Typed Notes/Advanced/DSA Trees 4 LCA + Morris Inorder Traversal.md b/Academy DSA Typed Notes/Advanced/DSA Trees 4 LCA + Morris Inorder Traversal.md new file mode 100644 index 0000000..5ff3a70 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Trees 4 LCA + Morris Inorder Traversal.md @@ -0,0 +1,726 @@ +# Advanced DSA : Trees 4: LCA + +--- +## Understanding Binary Trees and Binary Search Trees + +### Binary Trees + +A Binary Tree is a hierarchical data structure composed of nodes, where each node has at most two children: a left child and a right child. The top node is called the root, and nodes without children are called leaves. + +### Binary Search Trees (BSTs) + +A Binary Search Tree is a type of binary tree with an additional property: for each node, all nodes in its left subtree have values smaller than the node's value, and all nodes in its right subtree have values greater than the node's value. + +--- +### Problem 1 Finding the kth Smallest Element in a Binary Search Tree + + +Given a Binary Search Tree and a positive integer k, the problem is to find the kth smallest element in the BST. + +:::warning +Please take some time to think about the brute force approach on your own before reading further..... +::: + +### In-Order Traversal storing elements in array(Brute Force): + +#### Algorithm +1. Initialize a binary search tree (BST) as root. +2. Iterate through the elements of the array and insert each element into the BST. +3. Perform an in-order traversal of the BST to collect the elements in sorted order. +4. Access the Kth element from the sorted elements list. +5. Return the Kth element as the Kth smallest element. + +#### Pseudocode: +```java +// Define a TreeNode structure +Struct TreeNode: + val + left + right + +// Function to find the Kth smallest element in a BST +Function findKthSmallestElement(arr, k): + If arr is empty: + Return None // Array is empty, no elements to find + + Root = null // Initialize the root of the binary search tree + + // Step 1: Create a binary search tree (BST) from the array + For each element in arr: + Root = insert(Root, element) + + SortedElements = [] // Initialize an empty list to store sorted elements + + // Step 2: Perform an in-order traversal of the BST + InorderTraversal(Root, SortedElements) + + // Step 3: Return the Kth element from the sorted elements list + If 1 <= k <= length(SortedElements): + Return SortedElements[k - 1] // Subtract 1 because indices are 0-based + Else: + Return None // Handle the case when k is out of bounds + +// Function to insert a value into a BST +Function insert(root, value): + If root is null: + Return TreeNode(value) // Create a new node with the given value + + If value < root.val: + root.left = insert(root.left, value) // Insert into the left subtree + Else: + root.right = insert(root.right, value) // Insert into the right subtree + + Return root + +// Function to perform an in-order traversal of the BST +Function InorderTraversal(root, result): + If root is null: + Return + + // Step 4: Perform an in-order traversal recursively + InorderTraversal(root.left, result) + Append root.val to result + InorderTraversal(root.right, result) + +// Example usage: +Elements = [12, 3, 7, 15, 9, 20] +K = 3 // Find the 3rd smallest element + +Result = findKthSmallestElement(Elements, K) + +If Result is not null: + Output "The Kth smallest element is: " + Result +Else: + Output "Invalid value of K: " + K + +``` + +#### In-Order Traversal Approach(Count Method): +The in-order traversal of a BST visits the nodes in ascending order. Therefore, by performing an in-order traversal and keeping track of the count of visited nodes, we can identify the kth smallest element when the count matches k. + +#### Example: Finding the 3rd Smallest Element in a BST + +**BST:** + +```java + 4 + / \ + 2 6 + / \ / \ +1 3 5 7 +``` + +**Scenario:** +We want to find the 3rd smallest element in the given BST. + +**Solution:** + +* Perform an in-order traversal of the BST: +* In-order traversal: 1, 2, 3, 4, 5, 6, 7 +* The 3rd smallest element is 3. + +#### Pseudocode: +Here's a simplified pseudocode representation of finding the kth smallest element using in-order traversal: +```java +function findKthSmallest(root, k): + count = 0 + stack = [] + + while stack or root: + while root: + stack.append(root) + root = root.left + + root = stack.pop() + count += 1 + + if count == k: + return root.val + + root = root.right +``` + + +#### Analysis: + +The in-order traversal visits every node once, making the time complexity of this algorithm $O(n)$, where n is the number of nodes in the BST. The space complexity is $O(h)$, where h is the height of the BST, due to the stack used for traversal. + + +--- +### Problem 2 Morris Traversal + +#### Morris Traversal Approach: +Morris Traversal takes advantage of unused null pointers in the tree structure to link nodes temporarily, effectively threading the tree. By doing so, it enables us to traverse the tree in a specific order without requiring a stack or recursion. + +#### In-Order Morris Traversal: + +* Start at the root. +* Initialize the current node as the root. +* While the current node is not null: + * If the current node's left child is null, print the current node's value and move to the right child. + * If the current node's left child is not null: + * Find the rightmost node in the left subtree. + * Make the current node the right child of the rightmost node. + * Move to the left child of the current node. +* Repeat the process until the current node becomes null. + +#### Pre-Order Morris Traversal: + +* Start at the root. +* Initialize the current node as the root. +* While the current node is not null: + * Print the current node's value. + * If the current node's left child is null, move to the right child. + * If the current node's left child is not null: + * Find the rightmost node in the left subtree. + * Make the current node the right child of the rightmost node. + * Move to the left child of the current node. +* Repeat the process until the current node becomes null. + + +**Example:** +```java + 1 + / \ + 2 3 + / \ + 4 5 +``` +We will carefully go through each step: + +- **Step 1: Start at the root node, which is 1.** + 1. Initialize current pointer as current = 1. + +- **Step 2: At node 1:** + 1. Check if the left subtree of the current node is null. + 2. Since the left subtree of 1 is not null, find the rightmost node in the left subtree. This is node 5. + 3. Create a thread (temporary link) from 5 to the current node (1): 5 -> 1. + 4. Update the current node to its left child: current = 2. + +- **Step 3: At node 2:** + 1. Check if the left subtree of the current node is null. + 2. The left subtree of 2 is not null, so find the rightmost node in the left subtree of 2, which is 5. + 3. Remove the thread from 5 to 1 (undoing the link created earlier). + 4. Print the current node's value, which is 2. + 5. Move to the right child of the current node: current = 3 + + +- **Step 4: At node 3:** + 1. Check if the left subtree of the current node is null. + 2. The left subtree of 3 is null, so print the current node's value, which is 3. + 3. Move to the right child of the current node (null): current = None. + +- **Step 5:** Since the current node is now None, we've reached the end of the traversal. + 1. The Morris Inorder Traversal of the binary tree 1 -> 2 -> 4 -> 5 -> 3 allows us to visit all the nodes in ascending order without using additional data structures or modifying the tree's structure. It's an efficient way to perform an inorder traversal. + + +#### Pseudocode Example (In-Order): + +```java +function morrisInOrderTraversal(root): + current = root + while current is not null: + if current.left is null: + print current.value + current = current.right + else: + pre = current.left + while pre.right is not null and pre.right != current: + pre = pre.right + if pre.right is null: + pre.right = current + current = current.left + else: + pre.right = null + print current.value + current = current.right +``` + + +#### Analysis: +Morris Traversal eliminates the need for an explicit stack, leading to a constant space complexity of $O(1)$. The time complexity for traversing the entire tree remains $O(n)$, where n is the number of nodes. + +--- +### Question +What is the primary advantage of Morris Traversal for binary trees? + +**Choices** +- [ ] It uses an auxiliary stack to save memory. +- [ ] It guarantees the fastest traversal among all traversal methods. +- [ ] It allows for traversal in reverse order (right-to-left). +- [x] It achieves memory-efficient traversal without using additional data structures. + + + + +--- +### Problem 3 Finding an element + + +#### Approach: +Finding an element in a binary tree involves traversing the tree in a systematic way to search for the desired value. We'll focus on a common approach known as depth-first search (DFS), which includes pre-order, in-order, and post-order traversal methods. + +#### Algorithm: +1. Start at the root node of the binary tree. +2. If the root node is null (indicating an empty tree), return False (element not found). +3. Check if the value of the current node matches the target value: +4. If they are equal, return True (element found). +5. Recursively search for the target element in the left subtree by calling the function with the left child node. +6. Recursively search for the target element in the right subtree by calling the function with the right child node. +7. If the element is found in either the left or right subtree (or both), return True. +8. If the element is not found in either subtree, return False. + +#### Example: +```java + 1 + / \ + 2 3 + / \ + 4 5 +``` +**Dry Run:** +1. Start at the root (1). +2. Check if it matches the target (3) - No. +3. Move to the left child (2). +4. Check if it matches the target (3) - No. +5. Move to the left child (4). +6. Check if it matches the target (3) - No. +7. Move to the right child (null). +8. Move back to 4's parent (2). +9. Move to the right child (5). +10. Check if it matches the target (3) - No. +11. Move to the left child (null). +12. Move back to 5's parent (2). +13. Move back to 2's parent (1). +14. Check if it matches the target (3) - Yes, found! +15. Finish the search. + +#### Pseudocode Example: + +```java +function findElement(root, target) + if root is null + return False // Element not found in an empty tree + + if root.value is equal to target + return True // Element found at the current node + + // Recursively search in the left subtree + found_in_left = findElement(root.left, target) + + // Recursively search in the right subtree + found_in_right = findElement(root.right, target) + + // Return True if found in either left or right subtree + return found_in_left OR found_in_right +``` + + +#### Analysis: +The time complexity of finding an element in a binary tree using DFS depends on the height of the tree. In the worst case, it's O(n), where n is the number of nodes in the tree. The space complexity is determined by the depth of the recursion stack. + + +--- +### Problem 4 Path from root to node in Binary Tree + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Approach: +To find the path from the root to a specific node, we'll leverage depth-first search (DFS), a versatile traversal method that includes pre-order, in-order, and post-order traversal techniques. + +#### DFS Pre-Order Traversal for Finding Path: + +1. Initialize an empty list path to store the path. +2. Define a recursive function findPath(root, target, path): +3. If root is null, return False. +4. If root matches the target, append it to path and return True. +5. Recursively call findPath on the left subtree and right subtree. +6. If either subtree returns True, append root to path and return True. +7. Start the search from the root node by calling findPath(root, target, path). +8. If the search returns True, reverse the path list to get the path from root to target. +9. Return the reversed path. + +#### Pseudocode Example (DFS Pre-Order): + +```java +function findPath(root, target): + if root is null: + return false // Element not found in an empty tree + + if root.value == target: + list.add(root) // Add the current node to the list (path found) + return true; // Element found + + res = findPath(root -> left, target) OR findPath(root -> right, target) + + if res == true: + list.add(root) // Add the current node to the list (part of the path) + + return res; + +// Reverse the list to get the answer (the path from root to target) + +``` +#### Analysis: +The time complexity of finding the path from the root to a node using DFS depends on the height of the tree. In the worst case, it's O(n), where n is the number of nodes in the tree. The space complexity is determined by the depth of the recursion stack and the length of the path. + +--- +### Question +What is the primary benefit of using depth-first search (DFS) for finding the path from the root to a specific node in a Binary Tree? + +**Choices** +- [ ] DFS guarantees the shortest path between the root and the target node. +- [ ] DFS ensures that the tree remains balanced during traversal. +- [ ] DFS enables efficient path finding with a time complexity of O(log n). +- [x] DFS allows us to explore the structure of the tree while tracking visited nodes. + +--- +### Problem 5 finding the Lowest Common Ancestor (LCA) of two nodes + +#### Approach: +To find the LCA of two nodes in a binary tree, we'll utilize a recursive approach that capitalizes on the tree's structure. The LCA is the deepest node that has one of the nodes in its left subtree and the other node in its right subtree. + +#### Recursive Algorithm for LCA: + +* Start at the root of the binary tree. +* If the root is null or matches either of the target nodes, return the root as the LCA. +* Recursively search for the target nodes in the left and right subtrees of the current root. +* If both target nodes are found in different subtrees, the current root is the LCA. +* If only one target node is found, return that node as the LCA. +* If both target nodes are found in the same subtree, continue the search in that subtree. + + +**Example**: +```java + 1 + / \ + 2 3 + / \ + 4 5 + / \ + 6 7 + ``` +**LCA of nodes 6 and 3 is node 1.** +1. Start at the root (1). +2. Check for nodes 6 and 3 in the subtree rooted at 1. +3. Recursively search the left subtree (2). +4. Continue searching left (4). +5. Continue searching left (6). +6. Found node 6, but not node 3 in the left subtree. +7. Go back to node 4 and check the right subtree (null). +8. Go back to node 2 and check the right subtree (5). +9. Continue searching right (5). +10. Not found node 6 in the right subtree. +11. Go back to node 2 and check for nodes 6 and 3. +12. Found node 6 in the left subtree. +13. Return node 2 as the Lowest Common Ancestor (LCA). + + +#### Pseudocode Example: + +```java +function findLCA(root, node1, node2): + # Base case: if root is null or matches either of the nodes, return root + if root is null or root == node1 or root == node2: + return root + + # Recursively search for the target nodes in the left and right subtrees + left_lca = findLCA(root.left, node1, node2) + right_lca = findLCA(root.right, node1, node2) + + # Determine the LCA based on the search results + if left_lca and right_lca: + return root # Current root is the LCA + if left_lca: + return left_lca # LCA found in the left subtree + return right_lca # LCA found in the right subtree +``` + +#### Analysis: +The time complexity of finding the LCA in a binary tree using this recursive approach is O(n), where n is the number of nodes in the tree. The space complexity is determined by the depth of the recursion stack. + +--- +### Problem 6 Lowest Common Ancestor (LCA) in a Binary Search Tree (BST) + +#### Approach: +To find the LCA of two nodes in a Binary Search Tree, we'll utilize the properties of BSTs that make traversal and comparison more efficient. + +#### Algorithm for Finding LCA in a BST: + +* Start at the root of the BST. +* Compare the values of the root node, node1, and node2. +* If both nodes are smaller than the root's value, move to the left subtree. +* If both nodes are larger than the root's value, move to the right subtree. +* If one node is smaller and the other is larger than the root's value, or if either node matches the root's value, the root is the LCA. +* Repeat steps 2-5 in the chosen subtree until the LCA is found. + +#### Example: Finding LCA in a Binary Search Tree + +**BST:** +```java + 8 + / \ + 3 10 + / \ \ + 1 6 14 + / \ / + 4 7 13 +``` +Let's find the LCA of nodes 4 and 7 in this BST: + +- **Step 1:** + 1. Start at the root, which is node 8. + 2. Compare node 4 and node 7 with the current node's value (8). + 3. Both are smaller, so move to the left subtree (node 3). + +- **Step 2:** + 1. Move to node 3. + 2. Compare node 4 and node 7 with the current node's value (3). + 3. Both are larger, so move to the right subtree (node 6). + +- **Step 3:** + 1. Move to node 6. + 2. Compare node 4 and node 7 with the current node's value (6). + 3. Node 4 is smaller, and node 7 is larger. + 4. The current node (6) is the LCA of nodes 4 and 7. + 5. So, in this example, the LCA of nodes 4 and 7 in the BST is node 6. + +#### Pseudocode Example: + +```java +function findLCA(root, node1, node2): + if root is null: + return null // If the tree is empty, there's no LCA + + while root is not null: + // If both nodes are smaller than the current node, go left + if node1.value < root.value and node2.value < root.value: + root = root.left + // If both nodes are larger than the current node, go right + else if node1.value > root.value and node2.value > root.value: + root = root.right + // If one node is smaller and the other is larger, or if one matches, this is the LCA + else: + return root + + return null // If no LCA is found (unlikely in a valid BST) + +``` +#### Analysis: +The time complexity of finding the LCA in a BST is O(h), where h is the height of the BST. In a balanced BST, the height is log(n), making the LCA operation highly efficient. The space complexity is determined by the depth of the recursion stack. + + +--- +### Problem 7 In-time and Out-time of Binary Tree + + +#### Approach: +The Interval Assignment technique involves three main steps: DFS traversal, interval assignment, and construction of the rooted tree. + +:::warning +Please take some time to think about the further solution approach on your own before reading further..... +::: + +#### DFS Traversal and Interval Assignment: + +* Start a DFS traversal of the tree from any chosen starting node. +* As nodes are visited, assign start times when a node is entered and finish times when the traversal returns from that node. These times define intervals for each node. +#### Constructing the Rooted Tree: + +1. From the DFS traversal, we have a collection of intervals (start and finish times) for each node. +2. Choose the node with the smallest start time as the root of the rooted tree. +3. For each remaining node: + 1. Find the node with the largest start time that is still smaller than the current node's finish time. This node becomes the parent of the current node in the rooted tree. + 2. Repeat this process for all nodes. + +--- +### Question +What is the significance of in-time and out-time values in DFS traversal? + +**Choices** +- [ ] They indicate the number of times each node is visited during the traversal. +- [ ] They represent the depth of each node in the tree. +- [x] They help create hierarchical visualizations of trees. +- [ ] They are used to determine the balance of the tree. + + + +**Example:** +```java + 1 + / \ + 2 3 + / \ + 4 5 +``` +1. We initialize the global time variable to 1. +2. We traverse the tree using Depth-First Search (DFS): +3. Starting at Node 1: +4. In-Time for Node 1 is recorded as 1. +5. We recursively visit the left child, Node 2. +6. At Node 2: +7. In-Time for Node 2 is recorded as 2. +8. We recursively visit the left child, Node 4. +9. At Node 4: +10. In-Time for Node 4 is recorded as 3. +11. Since Node 4 has no further children, we record its Out-Time as 5. +12. Now, we return to Node 2: +13. We recursively visit the right child, Node 5. +14. At Node 5: +15. In-Time for Node 5 is recorded as 8. +16. Since Node 5 has no further children, we record its Out-Time as 10 +17. We return to Node 2 and record its Out-Time as 11. +18. We return to Node 1 and recursively visit its right child, Node 3. +19. At Node 3: +20. In-Time for Node 3 is recorded as 12. +21. We recursively visit its right child, but it's null. +22. We record the Out-Time for Node 3 as 14. +23. Finally, we return to Node 1 and record its Out-Time as 15. + +**The in-time and out-time values are now calculated:** +* Node 1 - In-Time: 1, Out-Time: 15 +* Node 2 - In-Time: 2, Out-Time: 11 +* Node 3 - In-Time: 12, Out-Time: 14 +* Node 4 - In-Time: 3, Out-Time: 5 +* Node 5 - In-Time: 8, Out-Time: 10 + +#### Pseudocode +```java +function calculateInTimeOutTime(root): + global time // A global variable to keep track of time + + // Initialize arrays to store in-time and out-time for each node + inTime = [0] * (2 * n) // Assuming 'n' is the number of nodes in the tree + outTime = [0] * (2 * n) + + // Helper function for DFS traversal + function dfs(node): + nonlocal time + + // Record the in-time for the current node and increment time + inTime[node] = time + time = time + 1 + + // Recursively visit left child (if exists) + if node.left is not null: + dfs(node.left) + + // Recursively visit right child (if exists) + if node.right is not null: + dfs(node.right) + + // Record the out-time for the current node and increment time + outTime[node] = time + time = time + 1 + + // Start DFS traversal from the root + dfs(root) + +``` + + +--- +### Problem 8 For multiple queries find LCA(x,y) + +#### Algorithm: +1. Calculate In-Time and Out-Time for Each Node: +2. First, calculate the in-time and out-time for each node in the binary tree as explained in a previous response. +3. Answer LCA Queries: +4. To find the LCA of multiple pairs of nodes (x, y): +5. For each LCA query (x, y): +6. Check if inTime[x] is less than or equal to inTime[y] and outTime[x] is greater than or equal to outTime[y]. If true, it means that node x is an ancestor of node y. +7. Check if inTime[y] is less than or equal to inTime[x] and outTime[y] is greater than or equal to outTime[x]. If true, it means that node y is an ancestor of node x. +8. If neither of the above conditions is met, it means that x and y have different ancestors. +9. In such cases, move up the tree from the deeper node until you find a node that is at the same level as the shallower node. This node will be their LCA. + +#### Example +```java + 1 + / \ + 2 3 + / \ + 4 5 +``` +And we'll find the Lowest Common Ancestor (LCA) for a few pairs of nodes (x, y) using the in-time and out-time approach. + +* **Step 1: Calculate In-Time and Out-Time**
We've already calculated the in-time and out-time values for this tree as follows: + 1. Node 1 - In-Time: 1, Out-Time: 10 + 2. Node 2 - In-Time: 2, Out-Time: 7 + 3. Node 3 - In-Time: 8, Out-Time: 9 + 4. Node 4 - In-Time: 3, Out-Time: 4 + 5. Node 5 - In-Time: 5, Out-Time: 6 + +* **Step 2: Find LCA for Pairs** + * Find LCA(4, 5): + * Check in-time and out-time: + * In-Time(4) <= In-Time(5) and Out-Time(4) >= Out-Time(5) is true. + * So, LCA(4, 5) is 4. + * Find LCA(2, 3): + * Check in-time and out-time: + * In-Time(2) <= In-Time(3) and Out-Time(2) >= Out-Time(3) is false. + * Now, bring both nodes to the same depth: + * Move 2 up once: 2 is now at the same depth as 3. + * Continue moving both nodes up: + * LCA(2, 3) is 1. + * Find LCA(4, 3): + * Check in-time and out-time: + * In-Time(4) <= In-Time(3) and Out-Time(4) >= Out-Time(3) is false. + * Now, bring both nodes to the same depth: + * Move 4 up once: 4 is now at the same depth as 3. + * Continue moving both nodes up: + * LCA(4, 3) is 1. + * Find LCA(5, 2): + * Check in-time and out-time: + * In-Time(5) <= In-Time(2) and Out-Time(5) >= Out-Time(2) is false. + * Now, bring both nodes to the same depth: + * Move 5 up once: 5 is now at the same depth as 2. + * Continue moving both nodes up: + * LCA(5, 2) is 1. + +#### Pseudocode: +```java +function findLCA(x, y): + if inTime[x] <= inTime[y] and outTime[x] >= outTime[y]: + return x # x is an ancestor of y + + if inTime[y] <= inTime[x] and outTime[y] >= outTime[x]: + return y # y is an ancestor of x + + # Move x and y up the tree to the same depth + while depth[x] > depth[y]: + x = parent[x] + + while depth[y] > depth[x]: + y = parent[y] + + # Move x and y up simultaneously until they meet at the LCA + while x != y: + x = parent[x] + y = parent[y] + + return x # LCA found +``` + +--- +### Question +What is the primary purpose of constructing a rooted tree using the start and finish times obtained during the DFS traversal? + +**Choices** +- [ ] To optimize the tree structure for faster traversal. +- [ ] To visualize the tree with nodes arranged in increasing order. +- [x] To efficiently represent the hierarchy and relationships within the tree. +- [ ] To eliminate the need for recursion in tree traversal. + +--- +### Observations + +* **In-Order Traversal:**
It visits Binary Search Tree (BST) nodes in ascending order, enabling efficient kth smallest element retrieval. +* **Morris Traversal:**
An efficient memory-saving tree traversal method with O(1) space complexity. +* **Path from Root:**
DFS traversal is used to find the path from the root to a node, with space complexity tied to recursion depth. +* **Lowest Common Ancestor (LCA) in Tree:**
LCA is found through recursion with O(n) time complexity and stack space. +* **In-Time & Out-Time:**
These values in DFS help create hierarchical visualizations of trees. +* **Interval Assignment Visualization:**
Provides a visual hierarchy for analyzing complex structures in various fields. +* **Finding LCA for Multiple Queries:**
LCA retrieval for multiple pairs involves adjusting node depths until they meet. + diff --git a/Academy DSA Typed Notes/Advanced/DSA Trees 5 Problems on Trees.md b/Academy DSA Typed Notes/Advanced/DSA Trees 5 Problems on Trees.md new file mode 100644 index 0000000..b942262 --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Trees 5 Problems on Trees.md @@ -0,0 +1,587 @@ +# Advanced DSA : Trees 5: Problems on Trees + +--- +## Problem 1 Invert Binary Tree + +Given the root node of a binary tree, write a function to invert the tree. + +**Example** +Original Binary Tree : +```plaintext + 1 + / \ + 2 3 + / \ + 4 5 +``` +After Inverting the Binary Tree : +```plaintext + 1 + / \ + 3 2 + / \ + 5 4 +``` +--- +### Question +Select the correct inverted binary tree for this given tree: + +``` + 4 + / \ + 2 7 + / \ \ +1 3 9 +``` +**Choices** + +- [ ] **Option 1:** + +``` + 4 + / \ + 7 2 + / \ / +9 3 1 +``` + +- [ ] **Option 2:** + +``` + 4 + / \ + 7 2 + \ / \ + 3 1 9 +``` + +- [ ] **Option 3:** + +``` + 4 + / \ + 2 7 + \ / \ + 1 9 3 +``` + +- [x] **Option 4:** + +``` + 4 + / \ + 7 2 + / \ / +9 1 3 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Solution** +To solve this problem,we can recursively invert the binary tree by swapping the left and right subtrees for each node. + +```cpp +void invertTree(TreeNode * root) { + if (root == nullptr) { + return; // Return if the root is null + } + + // Use a temporary variable to swap left and right subtrees + TreeNode * temp = root -> left; + root -> left = root -> right; + root -> right = temp; + + // Recursively invert the left and right subtrees + invertTree(root -> left); + invertTree(root -> right); +} + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(H) + +--- +### Problem 2 Equal Tree Partition + +Given the root of a binary tree, return ***true*** if the tree can be split into two non-empty subtrees with equal sums, or ***false*** otherwise. + +**Example 1** +```cpp +Input: + 5 + / \ + 10 10 + / \ + 2 3 + +Output: True +``` + +**Explanation:** + +```cpp + 5 + / + 10 + +Sum: 15 +``` + +```cpp + 10 + / \ + 2 3 + +Sum: 15 +``` +**Example 2** +```cpp +Input: + 1 + / \ + 2 10 + / \ + 2 15 +Output: false + +``` +**Explanation:** +There is no way to split the tree into two subtrees with equal sums. + + +--- +### Question +Check whether the given tree can be split into two non-empty subtrees with equal sums or not. + +```cpp + 5 + / \ + 10 10 + / \ + 20 3 + / + 8 +``` + +**Choices** +- [x] Yes, It is possible. +- [ ] It is impossible. + + +**Explanation:** + +Yes It is possible to split the tree into two non-empty subtrees with sum 28. + +Sub-Tree 1: +```cpp + 5 + / \ + 10 10 + \ + 3 + +``` + +Sub-Tree 2: +```cpp + 20 + / + 8 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Solution** + +1. **Total Sum Check**: +If the total sum of all nodes in the binary tree is odd, it is impossible to divide the tree into two subtrees with equal sums. This is because the sum of two equal values is always even, and if the total sum is odd, it cannot be divided equally into two parts. +2. **Subtree Sum Check**: +If we can find a subtree in the binary tree with a sum equal to half of the total sum, we can split the tree into two equal partitions by removing the edge leading to the root of that subtree. This means that we don't necessarily need to compare sums of all possible subtrees, but we can look for a single subtree that meets the subtree sum check condition. + +#### Pseudocode +```cpp +int sum(TreeNode * root) { + if (!root) { + return 0; + } + return sum(root -> left) + sum(root -> right) + root -> val; +} + +bool hasSubtreeWithHalfSum(TreeNode * root, int totalSum) { + if (!root) { + return false; + } + + int leftSum = sum(root -> left); + int rightSum = sum(root -> right); + + if ((leftSum == totalSum / 2 || rightSum == totalSum / 2) || hasSubtreeWithHalfSum(root -> left, totalSum) || hasSubtreeWithHalfSum(root -> right, totalSum)) { + return true; + } + + return false; +} + +bool isEqualTreePartition(TreeNode * root) { + if (!root) { + return false; // An empty tree cannot be partitioned + } + + int totalSum = sum(root); + + if (totalSum % 2 == 1) { + return false; // If the total sum is odd, partition is not possible + } + + return hasSubtreeWithHalfSum(root, totalSum); +} +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(H) + +--- +### Problem 3 Next Pointer in Binary Tree + +Given a perfect binary tree initially with all next pointers set to nullptr, modify the tree in-place to connect each node's next pointer to the next node in the same level from left to right, following an in-order traversal. + + +**Example** +```cpp +Input: + 1 + / \ + 2 3 + / \ / \ + 4 5 6 7 + +Output : + 1 -> nullptr + / \ + 2 -> 3 -> nullptr + / \ / \ + 4 -> 5 -> 6 -> 7 -> nullptr + +``` + +:::warning +Please take some time to think about the bruteforce approach on your own before reading further..... +::: + +#### Brute force solution +**Level order Traversal** : +1. We check if the binary tree is empty; if so, we return the root since there's nothing to connect. +2. A queue is created for level order traversal, initialized with the root node. +3. In the main loop, we process nodes at the current level. +4. At the start of each level, we determine the number of nodes at the current level (levelSize). +5. In the inner loop, we process each node at the current level: + * We dequeue the current node from the front of the queue. + * If the current node is not the last node in the level (i.e., i < levelSize - 1), we update its next pointer to point to the front of the queue, which connects nodes from left to right within the same level. + * We enqueue the left and right children of the current node (if they exist) into the queue for the next level. +6. The loop continues until all levels are processed. +7. Finally, the function returns the modified root of the binary tree, which now has next pointers connecting nodes at the same level, except for the last node in each level, whose next pointer remains nullptr. + + +#### Pseudocode : +```cpp +Node * connect(Node * root) { + // Check if the tree is empty + if (root is null) { + return null; + } + + // Create a queue and enqueue the root + queue < Node * > q; + q.push(root); + + // Traverse the tree level by level + while (!q.empty()) { + int levelSize = q.size(); + + // Process nodes at the current level + for (int i = 0; i < levelSize; ++i) { + Node * node = q.front(); + q.pop(); + + // Connect the current node to the next node in the same level + if (i < levelSize - 1) { + node -> next = q.front(); + } + + // Enqueue the left and right children (if they exist) for the next level + if (node has a left child) { + q.push(node 's left child); + } + if (node has a right child) { + q.push(node 's right child); + } + } + } + + // Return the modified root + return root; + } +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(N) + +#### Optimized Solution: +1. We create a dummy node and a temp pointer initially pointing to it. +2. We traverse the tree level by level from left to right. +3. For each node: +* If it has a left child, we connect the temp node's next pointer to the left child and update temp. +* If it has a right child, we connect the temp node's next pointer to the right child and update temp. +4. Level Completion: +5. When the current level is done, we move to the next level by updating root to the dummy node's next. We reset dummy's next and reset temp to the dummy node. +6. We repeat these steps until all levels are traversed. +7. The loop ends when there are no more levels to traverse. + + +#### Pseudocode +```cpp +void populateNextPointers(Node * root) { + if (!root) { + return; + } + + Node * dummy = new Node(-1); + Node * temp = dummy; + + while (root != nullptr) { + if (root -> left != nullptr) { + temp -> next = root -> left; + temp = temp -> next; + } + if (root -> right != nullptr) { + temp -> next = root -> right; + temp = temp -> next; + } + root = root -> next; + if (root == nullptr) { + root = dummy -> next; + dummy -> next = nullptr; + temp = dummy; + } + } +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(1) + +--- +### Problem 4 Check if Root to Leaf Path Sum Equals to K + +Given a binary tree and an integer k, determine if there exists a root-to-leaf path in the tree such that adding up all the node values along the path equals k. + +Example: +```cpp + +Input: + Binary Tree: + 5 + / \ + 4 8 + / / \ + 11 13 4 + / \ \ + 7 2 1 + + k = 22 + +Output: true +``` +**Explanation**: + +In the given binary tree, there exists a root-to-leaf path 5 -> 4 -> 11 -> 2 with a sum of 5 + 4 + 11 + 2 = 22, which equals k. Therefore, the function should return true. + +--- +### Question +Tell if there exists a root to leaf path with sum value `k = 19` +```cpp + 5 + / \ + 3 7 + / \ + 10 2 + / \ \ + 19 1 5 + + k = 20 + +``` +**Choices** +- [x] true +- [ ] false + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Solution:** +* To solve this problem,we first check if the current node is a leaf node (having no left and right children) and if the current value equals k. If both conditions are met, it returns true, indicating that a valid path is found. +* If not, it recursively checks the left and right subtrees with a reduced sum (k - root->val). +* It returns true if there's a path in either the left or right subtree, indicating that a valid path is found. + + +#### Pseudocode +```cpp +bool hasPathSum(TreeNode * root, int k) { + if (!root) { + return false; // No path if the tree is empty + } + + if (!root -> left && !root -> right) { + return (k == root -> val); + } + + return hasPathSum(root -> left, k - root -> val) || hasPathSum(root -> right, k - root -> val); +} + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(H) + +--- +### Problem 5 Diameter of Binary Tree + + +Given a binary tree, find the length of the longest path between any two nodes in the tree. This path may or may not pass through the root. + +**Definition of Diameter**: The diameter of a binary tree is defined as the number of nodes along the longest path between any two leaf nodes in the tree. This path may or may not pass through the root. + +--- +### Question +How would you find the diameter of a binary tree? + +**Choices** +- [ ] Add the height of the left and right subtrees. +- [ ] Count the number of nodes in the tree. +- [x] The maximum of the following three: Diameter of the left subtree, Diameter of the right subtree, Sum of the heights of the left and right subtrees plus one +- [ ] Divide the height of the tree by 2. + + + +**Example**: +Example that illustrates that the diameter of the tree can pass through a root node. +```cpp +Input: + + 1 + / \ + 2 3 + / \ + 4 5 +Output: 4 +``` +**Explanation**: +The diameter of the binary tree shown above is the path 4 -> 2 -> 1 -> 3, which contains four nodes. + + +**Example:** +Example that illustrates that the diameter of the tree can pass through a non-root node: +```cpp +Input: + 1 + / + 2 + / \ + 4 5 + / \ \ + 6 7 3 + +Output: 5 +``` +**Explanation:** +The diameter of the binary tree shown above is the path 6 - 4 - 2 - 5 - 3, which includes 5 nodes. + + +--- +### Question +What is the diameter of the Given Binary Tree. + +```cpp + 1 + / + 2 + / \ + 4 5 + / \ + 6 7 + \ + 8 + \ + 10 +``` + + +**Choices** +- [x] 6 +- [ ] 5 +- [ ] 7 +- [ ] 4 + + +**Explanation:** + +The path 1 -> 2 -> 4 -> 7 -> 8 -> 10 has 6 nodes, which is the diameter of the given tree. + + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Solution:** +1. To solve this problem,we initialize a diameter variable to 0 to track the maximum diameter. +2. Define a helper function that recursively computes both the height of the tree and the diameter +3. In the helper function: + * If the node is null, we return -1 to signify no height. + * We recursively find left and right subtree heights. + * We update diameter with the maximum diameter found, including the current node and connecting path (2 units). + * The height of the current node is the max of left and right subtree heights, plus 1. + * Call the helper function with the root of the binary tree from the main function or method. +4. Retrieve and use the maximum diameter found during traversal as the result. + +#### Pseudocode: +```cpp +int diameterOfBinaryTree(TreeNode * root) { + int diameter = 0; + + // Helper function to calculate height and update diameter + std:: function < int(TreeNode * ) > calculateHeight = [ & ](TreeNode * node) { + if (!node) { + return -1; // Height of a null node is -1 + } + + int leftHeight = calculateHeight(node -> left); + int rightHeight = calculateHeight(node -> right); + + // Update diameter with the current node's diameter + diameter = std::max(diameter, leftHeight + rightHeight + 2); + + // Return the height of the current node + return std::max(leftHeight, rightHeight) + 1; + }; + + calculateHeight(root); // Start the recursive calculation + + return diameter; +} + +``` + +#### Complexity +**Time Complexity:** O(N) +**Space Complexity:** O(H) diff --git a/Academy DSA Typed Notes/Advanced/DSA Two Pointers.md b/Academy DSA Typed Notes/Advanced/DSA Two Pointers.md new file mode 100644 index 0000000..a40a9fd --- /dev/null +++ b/Academy DSA Typed Notes/Advanced/DSA Two Pointers.md @@ -0,0 +1,645 @@ +# Two Pointers + +--- +## Problem 1 Pairs with given sum 2 + +*Given an integer sorted array `A` and an integer `k`, find any pair (i, j) such that `A[i] + A[j] = k`, `i != j`.* + + +**Example**: +A = [-5, -2, 1, 8, 10, 12, 15] +k = 11 + +Ans: (2, 4) as A[2] + A[4] = 1 + 10 = 11 = k + + + +--- +### Question +Check if there exists a pair with sum k +`A [ ] = { -3, 0, 1, 3, 6, 8, 11, 14, 18, 25 }` +`k = 12` + +**Choices** +- [x] Yes +- [ ] No + +**Explanation:** + +Yes. Because there are 2 pairs with sum as 11, They are +- (1, 11) +- (3, 8) +--- + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: +### Pairs with given sum 2 Approaches + + +#### Brute Force Apporach: +*Run two for loops and for every indices: i, j, check if sum is k.* + +- **Time Complexity:** +, as we need to use two for loops. +- **Space Complexity:** +O(1), as no additional space is required. + +#### Binary Search Apporach +**Observation**: +- We need to find two elements whose sum is `k`, i.e., `A[i] + A[j] == k`. +- So, `A[j] = k - A[i]`. Essentially, for an element, `A[i]`, we need to find an element `k - A[i]`. +- Since, array `A` is sorted, we can use binary search to find the element `k - A[i]`. (make sure, we are not choosing the same index again) + +**Approach**: *For all `i`, binary search and find `k - A[i]`.* + +- **Time Complexity:** +O(N * log(N)), as we need to apply binary search for every element in the worst case. +- **Space Complexity:** +O(1), as no additional space is required. + + + +--- +### Pairs with given sum 2 Two Pointers Approach + +Let's keep two pointers, `i` and `j` and we put them at 0 and 1st idx. + +We have, A = {-5, -2, 1, 8, 10, 12, 15} and k = 11 + +If A[0] = A[i] = -5 and A[1] = A[j] = -2 +A[i] + A[j] = -5 + (-2) = -7 +So, **A[i] + A[j] < k** + +To achieve the sum as `k`, we have to either increase i or j as the array is sorted. + +Now, if A[5] = A[i] = 12 and A[6] = A[j] = 15 +A[i] + A[j] = 12 + 15 = 27 +So, **A[i] + A[j] > k** + +In this case, to achieve `k`, we have to either decrease i or j. *Why?* + +> Essentially, we want to decrease the sum. The sum can be decreased by decreasing A[i] or A[j]. Since array is sorted, decrease the pointers will decrease the value as well. + +*Where should we place the pointers initially?* + +Initially, the pointers should be place at the beginning and end of the array as this way, we will have only one pointer in option to move in order to increase / decrease the sum. + +**Step 1:** +So, if we take A[i] = A[0] and A[j] = A[6] then, +A[i] + A[j] = A[0] + A[6] = -5 + 15 = 10 < k. So, we need to increase the sum. Which pointer should we move? + +Observations: +- This implies `-5 + largest element` is less than `k`. Therefore, `-5 + any element of A` will always be less than `k`. So, we do not need to check `-5` with any other number as the array is sorted. +- Hence, we should increase the `i` pointer to increase the sum. + +> **Note:** Our motive here is to eliminate the elements one by one till we reach towards the elements who can build the required sum. Since, `-5 + largset element < k`, we can safely eliminate `-5`. + +**Step 2:** +Now, taking A[i] = A[1] = -2 and A[j] = A[6] = 15 +A[i] + A[j] = -2 + 15 = 13 +Here, **A[i] + A[j] > k** +Following the same approach, we should decrease the index of j to decrease the sum. As decreasing the `i` would take us to the Step 1. + +**Step 3:** +Now, taking A[i] = A[1] = -2 and A[j] = A[5] = 12 +A[i] + A[j] = -2 + 12 = 10 +Here **A[i] + A[j] < k** +Following the same approach, we should increase the index of i to increase the sum. + +**Step 4:** +Similary, taking A[i] = A[2] = 1 and A[j] = A[5] = 10 +A[i] + A[j] = 1 + 10 +Here, **A[i] + A[j] = k**. + +#### Pseudocode: + +```java +while (i < j) { + if (A[i] + A[j] == k) { + return (i, j); + } else if (A[i] + A[j] < k) { + i++; + } else { + j--; + } +} +``` + +- **Time Complexity:** +O(N), as we need to traverse the complete array once in the worst case. +- **Space Complexity:** +O(1), as no additional space is required. + +--- +### Problem 2 Count Pair Sum K + + +Find all the pairs in a sorted array whose sum is k. + +**Example:** +A = {1, 2, 3, 4, 5, 6, 8} +k = 10 + +**Ans:** (2, 8), (4, 6) + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +#### Two Pointer Approach: +**`Case 1: When elements are distinct`** +- Use two pointer approach to find the first pair whose sum is 10. +- For array `A`, it will be (2, 8). +- As the elements are distinct, neither 2 nor 8 can make pair with any other pair whose sum is 10. So, increase the pointer `i` and decrease the pointer `j` and continue finding the pair whose sum is 10. +- The next pair with this approach would be (4, 6). Similary, move the pointers in required direction to find another pairs. +- Since, there aren't any more pairs. The final result would be: (2, 8) and (4, 6). + +**`Pseudocode:`** +```java +count = 0; +while (i < j) { + if (A[i] + A[j] == k) { + count++; + i++, j--; + } else if (A[i] + A[j] < k) { + i++; + } else { + j--; + } +} +return count; +``` + +**`Case 2: When elements are repeating (duplicates)`** +- **Using Frequency Array:** + - Consider the array, ( A = {2, 3, 3, 10, 10, 10, 15} ) with a target sum ( k = 13 ). + - Let's create the frequency map for the above. It would be - map ={[2 => 1], [3 => 2], [10 => 3], [15 => 1]} + - Now, create an array (A' = {2, 3, 10, 15}) by taking only the unique elements from array (A). + - Find the pair that contributes to the sum (13) in array (A'). The pair in this case would be (3, 10). + - The frequency of (3) is (2) and the frequency of (10) is (3) in the original array. So, the total number of such pairs in the original array would be ( 2 * 3 = 6). + - The key idea here is to transform the array with duplicate elements into an array of unique elements, find all the unique pairs that sum up to the target sum, and then use the frequencies of the elements in the original array to determine the count of all such pairs. + +- **Without using frequency array:** + - Consider array, A = {2, 3, 3, 5, 5, 7, 7, 10, 10, 10, 15} and k = 13 + - Find the pair whose sum is equal to k. In this case, (3, 10). + - Now, count the number of 3s and 10s and multiply them to find the effective number of pairs, i.e., 2 * 3 = 6. + - Change the position of i and j to next of last occurred 3 and 10, and continue the process. + - Final result would be 6. + +**`Pseudocode:`** +```javascript +count = 0; +while (i < j) { + if (A[i] + A[j] == k) { + counti = 1, countj = 1; + while (i < j && A[i] == A[i + 1]) { + counti++; + i++; + } + + while (i < j && A[j] == A[j - 1]) { + countj++; + j--; + } + + count = counti * countj; + i++, j--; + } else if (A[i] + A[j] < k) { + i++; + } else { + j--; + } +} +print(count) +``` + +--- +### Problem 3 Pair Difference K + +Given a sorted integer array A and an integer k. Find any pair (i, j) such that A[j] - A[i] = k, i != j and k > 0. + +Note: 0-based indexing +**Example:** +A[] = + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +|-------|---|---|---|---|---|---|---| +| Value | -5 | -2 | 1 | 8 | 10 | 12 | 15 | + +k = 11 + +Ans: (2, 5) as A[5] - A[2] = 12 - 1 = 11 = k. + + +#### Brute Force Apporach: +*Run two for loops and for every indices: i, j, check if difference is k.* + +- **Time Complexity:** +, as we need to use two for loops. +- **Space Complexity:** +O(1), as no additional space is required. + +#### Binary Search Apporach +*For all `i`, binary search and find `k + A[i]`.* + +- **Time Complexity:** +O(N * log(N)), as we need to apply binary search for every element in the worst case. +- **Space Complexity:** +O(1), as no additional space is required. + + + +--- + +### Question +Given an array A is **[5, 4, 2, 12, 1, 6]** and K is 10. + +Find any pair `(i, j)` such that +* A[j] - A[i] = k +* i != j + +Note: 0-based indexing +**Choices** +- [x] (2, 3) +- [ ] (5, 5) +- [ ] (0, 0) +- [ ] (3, 2) + +**Explanation:** + +The answer is (2, 3). + +Since (2, 3) satisfies both the condition: +* A[3] - A[2] = 10 +* 3 != 2 + + +--- +### Pair Difference K Two Pointers Apporach + +We have, A[] = +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +|-------|---|---|---|---|---|---|---| +| Value | -5 | -2 | 1 | 8 | 10 | 12 | 15 | + +and k = 11 + +*Where should we keep the pointers?* + +**Option 1:** +Let's start with keeping the pointers, `i` and `j` at the beginning and end of the array respectively, i.e., `i` = 0 and `j` = `N - 1` = 6. + +Observations: +- A[j] - A[i] = 15 - (-5) = 20 > k(11). So, to decrease the difference we need to either decrease A[j] or increase A[i]. +- We know that, either we can increase pointer `i` or decrease pointer `j`. Increasing pointer `i` will increase the `A[i]` and similarly, decreasing pointer `j` will decrease the `A[j]`. +- Since we do not have a single direction to move, we cannot eliminate any element. Therefore, placing the pointers at the beginning and the end isn't helpful. + + +**Option 2:** +Let's now place the pointers at (N - 2) and (N - 1) indices, i.e., i = N - 2 = 5 and j = N - 1 = 6. + +Observations: +- A[i] = A[5] = 12 and A[j] = A[6] = 15. A[j] - A[i] = A[6] - A[5] = 15 - 12 = 3. Therefore, **A[j] - A[i] < k** +- Here, we either need to increase A[j] or decrease A[i]. To increase A[j], j should be increased but it isn't possible as j is already pointing to the last element. So, we can decrease i. +- Doing so will eliminate the 12 to be possible second value of the pair. This is true because from here, we can conclude that the `largest element - A[i] < k`. So, `any element - A[i] < k` because the array is sorted. +- Thus, N - 2 and N - 1 are the correct possible initial values of pointers. + + +Similary result can be obtained by starting with index 0 and 1. +So, let's place the pointers at 0 and 1 indices, i.e., i = 0 and j = 1. + +**Step 1: i = 0, j = 1** +- A[i] = A[0] = -5 and A[j] = A[1] = -2. A[j] - A[i] = A[1] - A[0] = -2 - (-5) = 3. Therefore, **A[j] - A[i] < k** +- Here, we either need to increase A[j] or decrease A[i]. To decrease A[i], i should be decreased but it isn't possible as i is already pointing to the first element. So, we can increase j. + +**Step 2: i = 0, j = 2** +- A[i] = A[0] = -5 and A[j] = A[2] = 1. A[j] - A[i] = A[2] - A[0] = 1 - (-5) = 6. Therefore, **A[j] - A[i] < k** +- Similarly, increasing j. + +**Step 3: i = 0, j = 3** +- A[i] = A[0] = -5 and A[j] = A[3] = 8. A[j] - A[i] = A[3] - A[0] = 8 - (-5) = 13. Therefore, **A[j] - A[i] > k**. +- Since difference is greater than k, we need to decrease A[j] or increase A[i]. Hence, increasing i to increase A[i]. + +**Step 4: i = 1, j = 3** +- A[i] = A[1] = -2 and A[j] = A[3] = 8. A[j] - A[i] = A[3] - A[0] = 8 - (-2) = 10. Therefore, **A[j] - A[i] < k**. +- Since difference is less than k, we need to increase A[j] or decrease A[i]. Hence, increasing j to increase A[j]. + +**Step 5: i = 1, j = 4** +- A[i] = A[1] = -2 and A[j] = A[4] = 10. A[j] - A[i] = A[4] - A[0] = 10 - (-2) = 12. Therefore, **A[j] - A[i] > k**. +- Since difference is greater than k, we need to decrease A[j] or increase A[i]. Hence, increasing i to increase A[i]. + +**Step 6: i = 2, j = 4** +- A[i] = A[2] = 1 and A[j] = A[4] = 10. A[j] - A[i] = A[4] - A[0] = 10 - 1 = 9. Therefore, **A[j] - A[i] < k**. +- Since difference is less than k, we need to increase A[j] or decrease A[i]. Hence, increasing j to increase A[j]. + +**Step 7: i = 2, j = 5** +- A[i] = A[2] = 1 and A[j] = A[5] = 12. A[j] - A[i] = A[5] - A[0] = 12 - 1 = 11. Finally, **A[j] - A[i] = k**. +- Required pair: (i, j) = (2, 5). + +#### Pseudocode: +```java +i = 0, j = 1 +while (j < n) { + diff = A[j] - A[i]; + if (diff == k) { + return (i, j); + } else if (diff < k) { + j++; + } else { + i--; + } +} +``` + +*Why the `while` loop condition should be `j < n` and not `i < n`?* + +It is based on assumption that `i` will always be <= `j`. +Proof: +Suppose we start with `i = 0`, `j = 1` and after some steps `j` reaches `x`. +To `i` cross `j`, `i` should first reach `j`. When `i` reaches `j`, then `diff = 0`. It is given that `k > 0`, so in order to achieve this, `j` should be increased, and hence `i` can never exceed `j`. + + +- **Time Complexity:** +O(N), as we need to traverse the complete array once in the worst case. +- **Space Complexity:** +O(1), as no additional space is required. + +--- +### Problem 4 Check subarray with sum k + +Given an integer array `A` and an integer `k`. Check if there exists a subarray with sum `k` + +**Example:** +A = {1, 3, 15, 10, 20, 3, 23}; k = 33 + +**Ans:** True, because {10, 20, 3} sums upto 33. + +A = {1, 3, 15, 10, 20, 3, 23}; k = 43 + +**Ans:** False, because no subarray exists that sums upto 43 + +> Number of subarrays in an array of length n is `n * (n + 1) / 2`. + + +#### Brute Force Apporach: +*Check every subarray sum (with carry forward approach)* + +- **Time Complexity:** +, as we need to use two for loops. +- **Space Complexity:** +O(1), as no additional space is required. + + + +--- +### Question +If the given array is [1, 2, 5, 4, 3] and k is 9, does there exist a subarray with sum k? + +**Choices** +- [ ] Not Exist +- [x] Exist + +**Explanation:** + +Exist. The subarray is [5, 4]. + +--- + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +### Check subarray with sum k Two Pointers Approach + +Given A = {1, 3, 15, 10, 20, 3, 23}, k = 33. Let's create prefix sum array for this: Pf = {1, 4, 19, 29, 49, 52, 75}. + +> `sum(i, j)` = +> `Pf[j] - Pf[i - 1]`, if `i > 0` +> `Pf[j]`, if `i = 0` +- To find the subarray with sum `k`, we can utilize the prefix sum array. +- For all `j`, if we check `Pf[j]`, essentially, we have checked all the subarrays starting from 0. On the same line, if we check for `Pf[j] - Pf[i - 1]`, we checked for every other subarray which doesn't starts with 0 in the array. +- Hence, we need to find the values of `i` and `j` for which `Pf[j] - Pf[i - 1] = k`. This is equivalent to *finding a pair in a sorted array whose difference is `k`*. + +> Prefix sum array is always sorted for positive integer array as the sum of every next subarray is increasing. + + +- **Time Complexity:** O(N) + - Creating prefix sum array takes O(N) time. + - Using two pointers approach to find the pair having diff as `k` also takes O(N). + +- **Space Complexity:** +O(1), as no additional space is required if we use same array to create prefix sum array. + + +#### Dynamic Sliding Window Approach: +*We can maintain a running sum based on the pointers position and check if it is equal to `k`.* + +Example: + + A = {1, 3, 15, 10, 20, 3, 23, 33, 43}, k = 33 + +**Step 1:** i = 0, j = 0 +- `sum(i, j) = sum(0, 0) = A[0] = 1 < k`. To increase the sum, we need to increase the length of subarray, so `j++`. + +**Step 2:** i = 0, j = 1 +- `sum(i, j) = sum(0, 1) = A[0] + A[1] = 1 + 3 = 4 < k`. To increase the sum, we need to increase the length of subarray, so `j++`. + +**Step 3:** i = 0, j = 2 +- `sum(i, j) = sum(0, 2) = A[0] + A[1] + A[2] = 1 + 3 + 15 = 19 < k`. To increase the sum, we need to increase the length of subarray, so `j++`. + +**Step 4:** i = 0, j = 3 +- `sum(i, j) = sum(0, 3) = A[0] + A[1] + A[2] + A[3] = 1 + 3 + 15 + 10 = 29 < k`. To increase the sum, we need to increase the length of subarray, so `j++`. + +**Step 5:** i = 0, j = 4 +- `sum(i, j) = sum(0, 4) = A[0] + A[1] + A[2] + A[3] + A[4] = 1 + 3 + 15 + 10 + 20 = 49 > k`. To decrease the sum, we need to decrease the length of subarray. This can either be done by `i++` or `j--`. If we do `j--`, we will be at the same stage at step 4, which isn't helpful. So, we need to do `i++` to decrease the length and effectively the sum. + +**Step 6:** i = 1, j = 4 +- `sum(i, j) = sum(1, 4) = A[1] + A[2] + A[3] + A[4] = 3 + 15 + 10 + 20 = 48 > k`. Again, we need to decrease the length to decrease the sum. + +*What shall we do here: `i++` or `j--`?* +We know that, sum (0, 3) < k. Therefore, sum(1, 3) will definitely be less than k. Therefore, `i++` is correct way out here. + +**Step 7:** i = 2, j = 4 +- `sum(i, j) = sum(2, 4) = A[2] + A[3] + A[4] = 15 + 10 + 20 = 45 > k`. Again, we need to decrease the length to decrease the sum. As discussed above, do `i++`. + +**Step 8:** i = 3, j = 4 +- `sum(i, j) = sum(3, 4) = A[3] + A[4] = 10 + 20 = 30 < k`. To increase the array length, do `j++`. + +**Step 9:** i = 3, j = 5 +- `sum(i, j) = sum(3, 5) = A[3] + A[4] + A[5] = 10 + 20 + 3 = 33 = k`. We have found the required subarray. + + +#### Pseudocode +```java +i = 0, j = 0, sum = A[0] + +while (j < n) { + if (sum == k) { + return true; + } else if (sum < k) { + j++; + if (j == n) { // To make sure index is not out of bounds + break; + } + + sum += A[j]; + } else { + sum -= A[i]; + i++; + if (i > j) { // To make sure i never exceeds j + break; + } + } +} + +return false; +``` + +- **Time Complexity:** +O(N), as in the worst case, complete array will be traversed. +- **Space Complexity:** +O(1), as no additional space is required if we use same array to create prefix array. + +--- +### Problem 5 Container with most Water + +Given an integer array `A` where array elements represent the height of the wall. Find any two walls that can form a container to store the maximum amount of water. + +**Example:** +A = {4, 2, 10, 6, 8, 2, 6, 2} + + + + +**Ans:** 24. (Maximum amount of water stored between walls at idx (1 and 7) or between idx (3 and 7)) + +Since `area = height * width`, therefore +Amount of water stored between any two walls `A[i]` and `A[j]` = `min(A[i], A[j]) * (j - i)`, where height = `min(A[i], A[j])` and width = `(j - i)`. + +> **Note:** height = `min(A[i], A[j])`, as water can be stored upto minimum height of the wall, and width = `(j - i)`, i.e., the difference between the position of walls. + +#### Brute Force Apporach: +*Choose all the pair of walls, calculate the amount of water stored between them and find the maximum.* + +- **Time Complexity:** +O(N$^2$), as we need to use two for loops. +- **Space Complexity:** +O(1), as no additional space is required. + + +--- +### Question +What is the water trapped between 2 walls at index L and R. +Array A gives the heights of buildings +Chose the correct answer + + +**Choices** +- [x] (R - L) * min(A[L], A[r]) +- [ ] (R - L)* max(A[L], A[r]) +- [ ] (R - L + 1) * min(A[L], A[r]) +- [ ] (R - L + 1) * max(A[L], A[r]) + + +**Explanation:** + +The answer is **(R - L) * min(A[L], A[r])**. + +* Amount of water stored between any two walls A[L] and A[R] = min(A[L], A[R]) * (R - L) + +where height = min(A[L], A[R]) +width = (R - L). + + +--- + +:::warning +Please take some time to think about the optimised approach on your own before reading further..... +::: + +### Container with most Water Two Pointer Approach + + +- Since `area = height * width`. To achieve the maximum area, we should find the maximum values for height and width. +- Let's start with maximum width, so keep i = 0 and j = n - 1. +- `height = min(A[i], A[j])`. So, in order to increase the height, we should move in the direction of increasing the minimum height. + +**Example:** +A[] = + +| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +|-------|---|---|---|---|---|---|---|---| +| Value | 4 | 2 | 10 | 6 | 8 | 2 | 6 | 2 | + + +**Step 1:** i = 0, j = 7, max_area = -1 (Initially) +- `height = min(A[0], A[7]) = min(4, 2) = 2`. + `width = j - i = 7 - 0 = 7`. + `area = height * width = 2 * 7 = 14`. + `max_area = max(max_area, area) = max(-1, 14) = 14`. + To increase the area, we need to move in direction of increasing the minimum height. Since min height is 2, this can be increased by doing `j--`. + +**Step 2:** i = 0, j = 6, max_area = 14 +- `height = min(A[0], A[6]) = min(4, 6) = 4`. + `width = j - i = 6 - 0 = 6`. + `area = height * width = 4 * 6 = 24`. + `max_area = max(max_area, area) = max(14, 24) = 24`. + To increase the area, we need to move in direction of increasing the minimum height. Since min height is 4, this can be increased by doing `i++`. + +**Step 3:** i = 1, j = 6, max_area = 24 +- `height = min(A[1], A[6]) = min(2, 6) = 2`. + `width = j - i = 6 - 1 = 5`. + `area = height * width = 2 * 5 = 10`. + `max_area = max(max_area, area) = max(24, 10) = 24`. + To increase the area, we need to move in direction of increasing the minimum height. Since min height is 2, this can be increased by doing `i++`. + +**Step 4:** i = 2, j = 6, max_area = 24 +- `height = min(A[2], A[6]) = min(10, 6) = 6`. + `width = j - i = 6 - 2 = 4`. + `area = height * width = 6 * 4 = 24`. + `max_area = max(max_area, area) = max(24, 24) = 24`. + To increase the area, we need to move in direction of increasing the minimum height. Since min height is 6, this can be increased by doing `j--`. + +**Step 5:** i = 2, j = 5, max_area = 24 +- `height = min(A[2], A[5]) = min(10, 2) = 2`. + `width = j - i = 5 - 2 = 3`. + `area = height * width = 2 * 3 = 6`. + `max_area = max(max_area, area) = max(24, 6) = 24`. + To increase the area, we need to move in direction of increasing the minimum height. Since min height is 2, this can be increased by doing `j--`. + +**Step 6:** i = 2, j = 4, max_area = 24 +- `height = min(A[2], A[4]) = min(10, 8) = 8`. + `width = j - i = 4 - 2 = 2`. + `area = height * width = 8 * 2 = 16`. + `max_area = max(max_area, area) = max(24, 16) = 24`. + To increase the area, we need to move in direction of increasing the minimum height. Since min height is 2, this can be increased by doing `j--`. + +**Step 7:** i = 2, j = 3, max_area = 24 +- `height = min(A[2], A[3]) = min(10, 6) = 6`. + `width = j - i = 3 - 2 = 1`. + `area = height * width = 6 * 1 = 6`. + `max_area = max(max_area, area) = max(24, 6) = 6`. + After this, moving any of i or j will yield width as 0. Hence, we stop the execution and final ans is 24. + + +#### Pseudocode: +```java +i = 0, j = n - 1; +while (i < j) { + area = min(A[i], A[j]) * (j - 1); + if (A[i] < A[j]) { + i++; + } else if (A[i] > A[j]) { + j--; + } else { + i++, j--; // Doesn't matter if we move only i or j or both + } +} +return area; +``` + +- **Time Complexity:** +O(N), as we are traversing the complete array only once. +- **Space Complexity:** +O(1), as no additional space is required. diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner Data Types 2 + Reading .md b/Academy DSA Typed Notes/Beginner Language/Beginner Data Types 2 + Reading .md new file mode 100644 index 0000000..ce7eda0 --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner Data Types 2 + Reading .md @@ -0,0 +1,1070 @@ +# Beginner : Data Types 2 + Reading Inputs + +--- + +Recap: Start the class with Revising the previous session rules: + +:::success +There are a lot of quizzes in this session, please take some time to think about the solution on your own before reading further..... +::: + +## Revision: Type Casting Rules + +1. Int data can be stored in long and there wont be any loss of data, so there wont be any issues. +Ex: +int a = 10; +long b = a; +System.out.print(b); --> 10 + +2. Long data cannot be stored in int, there can be a loss of data so we will get an error +Ex: +long a = 100; +int b = a; +System.out.print(b); Error + +3. If we want to still force we need to keep explicitly type cast it +Ex : +long a = 100; +int b = (int)a; +System.out.print(b) --> 100 + +--- + +# Question + + +``` +int a = 10000; +long b = a; +System.out.print(b); +``` + +# Choices + +- [x] 10000 + +- [ ] Compilation Error + +- [ ] 100000.0 + +- [ ] 10000L + +--- + +**Explanation:** +First line we create a variable of type int then we are creating a long type variable "b" and trying to store the value of "a" in it. This is Implicit Typecasting. +Ans= 10000 + + +--- + +# Question + + +``` +long x = 10000; +System.out.print(x); +``` + +# Choices + +- [ ] 10000L + +- [ ] Compilation Error + +- [x] 10000 + +- [ ] None of the above + +--- + +**Explanation:** +First line automatic typecasting is happening between Int and Long. +Ans= 10000 + +--- + +# Question + + +``` +long x = 10000; +int y = x; +System.out.print(y); +``` +# Choices + +- [ ] 10000L + +- [x] Compilation Error + +- [ ] 10000 + +- [ ] None of the above + + +--- + +**Explanation:** +First line we create a variable of type long then we are creating a int type variable "y" and trying to store the value of "x" in it. In this acse there is a possiblilty of Data Loss. +Error- Possible lossy conversion from long to int. + +--- + +# Question + + +``` +long x = 1000; +int y = (int)x; +System.out.print(y); +``` + +# Choices + +- [x] 1000 + +- [ ] Compilation Error + +- [ ] 1000L + +- [ ] None of the above + +--- + +**Explanation:** +`int y = (int)x;` Now with this line we are forcing the compiler to typecast it to int. +It is explicit Typecasting. +Ans= 1000. + +--- + +# Question + + +``` +long a = 10000000000L; +int b = (int)a; +System.out.print(b); +``` + +# Choices + +- [ ] 10000000000 + +- [x] Random Value + +- [ ] 10 + +- [ ] None of the above + +--- + +**Explanation:** +`int b = (int)a;` Here we are forcing the compiler to store the value 10^10 into int. Because of that overflow will happen. +Ans= Some random value. + + +--- + +## Taking input from the user: + +Tool to take input from the user: Scanner. + +**Syntax of Scanner:** +``` +Scanner scn = new Scanner(System. in); +``` + +> We dont need to know what is this scanner. Just exactly follow the syntax to take input from the user. + +Now in order to use scanner also we need to write one line: + +``` +import java.util.*; +``` + +> Consider this like in order to play pubg we need to import some files, some packages similarly to use scanner we need to import java files. + + +### Take Input and print the output: +``` +int x = scn.nextInt(); +System.out.print(x); +``` +**Explanation:** +Here we are taking the help of scanner by using its name scn and asking the user for an integer value which we will store in "x" varaible. + +> Just try to give different integer values in the custom input and explain how it got printed. + +**Take input and print twice the number:** + +``` +int y = scn.nextInt(); +System.out.print(2 * y); +``` + +--- + +# Question + +Predict the output for given input: +Input: 100 + +``` +scanner sc = new scanner(System.in); +int xyz = sc.nextInt(); +System.out.print(xyz); +``` + +# Choices +- [ ] xyz +- [x] Error +- [ ] 100 +- [ ] Goodnight :) + +--- + +**Explanation:** +At line 1, scanner is in small letter. Because Java is case sensitive. + + +--- + +# Question + +Predict the output for given input: +Input: 594 + +``` +Scanner sc = new Scanner(system.in); +int abc = sc.nextInt(); +System.out.print(abc); +``` + +# Choices +- [ ] 594 +- [x] Error +- [ ] abc +- [ ] Only here to watch! + +--- + +**Explanation:** +Error: S in System should be capital. + +--- + +# Question + +Predict the output for given input: +Input: 5000 + +``` +Scanner scn = new Scanner(System.in); +int a = scn.nextInt(); +System.out.print(a); +``` + +# Choices +- [ ] Error +- [x] 5000 +- [ ] Watching Netflix on the side! + +--- + + +**Explanation:** +Here we are creating a variable "a" and taking integer from the user. + + +--- + +# Question + +Predict the output for given input: +Input: 24 30 +``` +Scanner sc = new Scanner(System.in); +int a = sc.nextInt(); +int b = sc.nextInt(); +System.out.print(a); +``` +# Choices +- [x] 24 +- [ ] 30 +- [ ] Error + +--- + + +**Explanation:** + +The first value will be stored in first variable and second value will be stored in second variable. + + +--- + +# Question + +Predict the output for given input: +Input: 33 11 + +``` +Scanner sc = new Scanner(System.in); +int c = sc.nextInt(); +int d = sc.nextInt(); +System.out.print(c + d); +``` +# Choices +- [ ] 3311 +- [ ] c + d +- [x] 44 +- [ ] Error + +--- + + +**Explanation:** + +"c" variable will have value 33, and "d" variablle will have value 11. + + +--- + +# Question + +What will be the output for the following input? +``` +Input: 15 21 +Scanner sc = new Scanner(System.in); +int a = sc.nextInt(); +int b = sc.nextInt(); +int c = sc.nextInt(); +System.out.print(a + b + c); +``` +# Choices +- [ ] 36 +- [ ] a + b + c +- [ ] 36c +- [x] Error + +--- + + +**Explanation:** +"a" variable will have value 15, then variable "b" will have value 21, but for "c" variable user is not giving any input. +Ans = Error, No such element exception. + +--- + + +### Input for long data type: +``` +Scanner scn = new Scanner(System .in); +long c = scn.nextLong(); +``` + +--- + +# Question +How to take input for a long variable? + +# Choices +- [ ] sc.nextlong() +- [ ] sc.nextint() +- [x] sc.nextLong() +- [ ] sc.nextInt() + +--- + +# Question + +Predict the output for the following input: +Input: 10000000000 +``` +Scanner scn = new Scanner(System.in); +long N = scn.nextLong(); +System.out.println(N); +``` +# Choices +- [x] 10000000000 +- [ ] Error +- [ ] 10000000000L + +--- + +# Question + +Predict the output for the following input: +Input: 10000000000L + +``` +Scanner scn = new Scanner(System.in): +long N = scn.nextLong(); +System.out.println(N); +``` +# Choices +- [ ] 10000000000 +- [x] Error +- [ ] 10000000000L + +--- + +**Explanation:** + +Here, when we give L in the input, then the whole input is not a number anymore. +Ans = Error, Input Mismatch. + +> Do not write L in the input section to give a long value. + +--- + +# Question +``` +Input: 2500 +long x = scn.nextInt(); +System.out.print(x); +``` +# Choices +- [x] 2500 +- [ ] Error +- [ ] 2500L + +--- + +**Explanation:** + +First 2500 is considered an integer value, ans we can store an integer value into long. It is implicit typecasting. + + +--- + +# Question +``` +Input: 2500 +int x = scn.nextLong(); +System.out.print(x); +``` +# Choices +- [ ] 2500 +- [x] Error +- [ ] 2500L + +--- + +**Explanation:** +Now here from long to int, it cannot happen automatically. +Ans = Error, possible lossy conversion from long to int. + +**Correct** +``` +Input: 2500 +int x = (int)scn.nextLong(); +System.out.print(x); +``` + +Ans = 2500. + +--- + +## Float vs Double + +1. Non Decimal{Integers} --> Datatypes : int long +2. Decimal --> float double +Ex : 1.24 , 1.56 , 20.0,and soon... + + +**Declare a variable of any Type +Syntax: type name = value;** + +--- + +# Question + +``` +double d = 6.17; +System.out.print(d); +``` + +# Choices + +- [ ] Compilation Error +- [ ] 6 +- [x] 6.17 +- [ ] None of the above + +--- + +**Explanation:** +We are creating a variable of type double. +Ans= 6.17 + +--- + +# Question + +``` +float x = 3.14; +System.out.print(x); +``` + +# Choices + +- [x] Compilation Error +- [ ] 3.14f +- [ ] 3.1400001 +- [ ] 3.14 + +--- + +**Explanation:** +Error-> Possible lossy conversion from double to float. + +> Rule : In JAVA, Any decimal number is considered as double + + +--- + +# Question + + +``` +float a = 3.14f; +System.out.print(a); +``` + +# Choices + +- [ ] 3.1400001 +- [x] 3.14 +- [ ] Compilation Error +- [ ] None of the above + +--- + +**Explanation:** +Now when we add "f" in front of it, Basically we are trying to tell compiler, consider this as float. +Ans= 3.14 + +--- + +### Difference Between Float and Double? + +``` +float a = 10.0f; +float b = 3.0f; +float c = (a/b); +System.out.println(c); +``` + +``` +double x = 10.0; +double y = 3.0; +double z = x/y; +System.out.println(z); +``` +**Output:** +```plaintext +3.3333333 +3.3333333333333335 +``` +**Explanation:** +* float -> can have upto 6 to 7 digits after decimal point. +* double -> can have upto 15 to 16 digits after decimal point. +* double is more precise [more digits after decimal point] + +--- + +## Type Casting Float vs Double +**Rules:** + +Same Rules of int vs long apply here, + +1. When we store float to double no loss of data hence no issue +{Implicit Type Casting}. + +2. When we store double to float there can be a loss of data, complier will raise an error. +``` +double d = 3.14 +float f = d // Error +``` +3. If we want to still force we need to keep explicitly type cast it. +``` +double d = 3.14 +float f = (float)d; // doubtle --> Explicilty --> float +System.out.print(f); // 3.14 +``` + +--- +# Question + + +``` +double x = 3.14; +float y = x; +System.out.print(y); +``` + +# Choices + +- [ ] 3.14f +- [ ] 3.14 +- [x] Compilation Error +- [ ] None of the above + +--- + +**Explanation:** +Here we are trying to store a double type value into float. +Error- Possible lossy conversion from double to float. + +--- + +# Question + + +``` +double x = 17.67; +float y = (float)x; +System.out.print(y); +``` + +# Choices + +- [x] 17.67 +- [ ] 17.669999999999998 +- [ ] Compilation Error +- [ ] None of the above + +--- + +**Explanation:** +In this case, we are forcing the compiler to convert double to float. +This is known as Explicit Typecasting. +Ans= 17.67 + +**No data loss -> No error** +* int (45) -> double -> No error +* double (45.6) -> int -> Error + +--- + +## Type Casting Decimal vs Non Decimal +For typecasting just remember 2 rules: +1. If there is is no loss of data then no error : Implicit from non-decimal to decimal : Implicit. +2. If there is chance for loss of data then error but We can still do this type casting forcefully : Explicit from decimal to non - decimal : Explicilty. + + +--- + +# Question + + +``` +double x = 3.45; +int y = x; +System.out.print(y); +``` + +# Choices + +- [ ] 3 +- [ ] 3.45 +- [x] Compilation Error +- [ ] None of the above + +--- +**Output:** +``` +Error- Possible lossy conversion from double to int. +``` + +--- + +# Question + + +``` +double x = 3.45; +int y = (int)x; +System.out.print(y); +``` + +# Choices + +- [x] 3 +- [ ] 3.45 +- [ ] Compilation Error +- [ ] None of the above + + +--- + +**Explanation:** +Here we are forcing the compiler to convert 3.14 to int, We will only get the integer part. +Ans= 3. + +--- + +# Question + +Quiz 24: +``` +int x = 40; +double y = x; +System.out.print(y); +``` + +# Choices + +- [ ] 40 +- [x] 40.0 +- [ ] Compilation Error +- [ ] None of the above + + +--- + +**Explanation:** +In this example, we are trying to store a int type value into double. +Double stores decimal values, and here we can easily convert 40 to 40.0, therefore it is called Implicit Typecasting. +Ans= 40.0 + + +--- + + +## Reading Inputs for Float and Double + +``` +How to take input for a float variable? +``` +``` +Scanner scn = new Scanner(System.in); +float a = scn.nextFloat(); +``` + + +``` +How to take input for a double variable? +``` +``` +Scanner scn = new Scanner(System.in); +double a = scn.nextDouble(); +``` + +#Ques 1: +``` +float x = sc.nextFloat(); +System.out.println(x); +``` + + Explain we don't need to write "f" while taking inputs for float. + +--- + +# Question + + +``` +Input : 3.14 + +Scanner sc = new Scanner(System.in); +float a = sc.nextFloat(); +System.out.print(2 * a); +``` + +# Choices + +- [ ] 2.0 +- [ ] 3.14 +- [x] 6.28 +- [ ] 1.57 + +--- + +**Explanation:** +Now this 3.14 is stored on variable "a", Then we are trying to print 2*a-> 2* 3.14. +Ans= 6.28 + +--- + +# Question + + +``` +Input : 3.14 20 + +Scanner sc = new Scanner(System.in); +int a = sc.nextInt(); +int b = sc.nextInt(); +System.out.print(a + b); +``` + +# Choices + +- [ ] 17 +- [ ] 3 +- [ ] 14 +- [x] Error + +--- + +**Explanation:** +In the first line, we are trying to take an integer type input, But the user is not giving an integer value for the first time. +Error-> Input mismatch. + +--- + +# Question + + +``` +Input : 3.14 + +Scanner sc = new Scanner(System.in); +float a = sc.nextFloat(); +float b = sc.nextFloat() +System.out.print(2 * a); +``` + +# Choices + +- [ ] 6.28 +- [ ] 3.14 +- [x] Error +- [ ] None of the above + + +--- + +**Explanation:** +There are 2 errors, +In line `float b = sc.nextFloat()` semicolon is missing. +We are only giving one input. +Error- No such element exeception. + +--- + +# Ques 1 + +**Code:** +``` +Input: 3.45 +int x = sc.nextDouble(); +System.out.println(x); +``` +Explanation: + +According to rules of typecasting, we cannot do it there is a chance of data loss. +Ans=Error + + +**Correct Code:** +``` +Input: 3.45 +int x = (int)sc.nextDouble(); +System.out.println(x); +``` +Explanation: + +In this case, we are forcing the compiler to do it, But int can only store integer value, so we will only get the integer part as output. +Ans=3 + + +# Ques 2 +``` +Input: 3 +double y = sc.nextInt(); +System.out.println(y); +``` + +Explanation: + +We can easily Typecast from integer to decimal. +Ans=3.0 + +--- +## Dividing numbers by zero + +``` +System.out.println(4 / 0); +``` +Output: +``` +Error +``` + +``` +System.out.println(4.0 / 0); +``` +Output: +```plaintext +Infinity +``` +``` +System.out.println(4.0f / 0); +``` +Output: +```plaintext +infinity +``` + +``` +System.out.println(0 / 0); +``` + +Output: +```plaintext +Error. +``` + +``` +System.out.println(0.0 / 0); +``` +Output: +```plaintext +NAN[Not A Number]. +``` + + + +--- +## Boolean Input + + + Ques1: +``` +boolean x = false; +System.out.println(x); +```` + +Output: +``` +false. +``` + +boolean -> true / false only, it will work on True/False, but give answer in lowercase only. + +Ques2: +``` + +Input: true +Scanner sc = new Scanner(System.in); +boolean y = sc.nextBoolean(); +System.out.println(y); +``` + +Output: +``` +true +``` +### Take inputs like True/False/false also. + +--- +## Arithmetic Operators + ++, -, *, / are very basic arithmetic operators. Confirm whether the students know about them. And directly give the below quiz. + +--- + + +# Question +What will be the output? +``` +int a = 10; +int b = 24; +System.out.println(a+b); +System.out.println(a-b); +System.out.println(a*b); +System.out.println(b/a); +``` + +# Choices +- [ ] 34
-14
240
2.4 +- [ ] 34
14
240
2 +- [x] 34
-14
240
2 +- [ ] None of them + +--- + + +# Explanation + +a + b -> 10 + 24 = 34 +a - b -> 10 - 24 = -14 +a * b -> 10 * 24 = 240 +b / a -> 24 / 10 = 2 (Because both are integers, so the result should be an integer.) + +--- + +One more arithmetic operator: +% -> Modulus Operator (Gives remainder of divison of two numbers as output) + +### Examples +12 % 4 = 0 +9 % 7 = 2 +24 % 5 = 4 + +Now, give the following quiz. + + +--- + + +# Question +What will be the output? +``` +System.out.print(36 % 6); +``` + +# Choices +- [ ] 3 +- [ ] 6 +- [x] 0 +- [ ] Error + + +--- + + +# Question +What will be the output? +``` +System.out.print(5 % 3); +``` + +# Choices +- [ ] 1 +- [x] 2 +- [ ] 3 +- [ ] Error + +If necessary, take some more examples. + + +--- + + +**Q.** What are Relational operators? +**A.** Relational operators are used to check the relations between two operands. After comparison, the relational operators return a boolean value. + +**Syntax:** +``` +operand1 relational_operator operand2 +``` + + +| Relation between a and b | Syntax | a = 45, b = 16 | a = 5, b = 5 | +|:-------------------------------:|:------:|:--------------:|:------------:| +| a is greater than b | a > b | True | False | +| a is less than b | a < b | False | False | +| a is greater than or equal to b | a >= b | True | True | +| a is less than or equal to b | a <= b | False | True | +| a is equal to b | a == b | False | True | +| a is not equal to b | a != b | True | False | + + +**Note:** Explain the difference between assignment operator (=) and equality operator (==). + diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner Data Types.md b/Academy DSA Typed Notes/Beginner Language/Beginner Data Types.md new file mode 100644 index 0000000..2d4d118 --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner Data Types.md @@ -0,0 +1,722 @@ +# Beginner: Data Types + +--- + +# Agenda + +* Quizes to revise the previous session +* Rules of Naming a variable +* Different categories of Data + * Why we need multiple datatype under one category + * Int Vs Long +* TypeCasting + +:::success +There are a lot of quizzes in this session, please take some time to think about the solution on your own before reading further..... +::: + +--- + +# Question + +What will be output for this ? +``` +System.out.print(12 + 4 + "try" + 3 * 4); +``` +# Choices +- [ ] Error +- [ ] 124try34 +- [ ] 16try34 +- [x] 16try12 + + +--- + +# Question + +``` +Declare a int variable with name x and intialize with value 10 +``` + +# Choices +- [ ] x int = 10; +- [ ] int x = 20 +- [x] int x = 10; +- [ ] None of them + +--- + + +# Question +``` +int x = 10; +int y = 20; +System.out.print(x + y); +``` + +# Choices +- [ ] Error +- [ ] x + y +- [x] 30 +- [ ] 1020 + + +--- + + +# Question +``` +int x = 10; +int y = 20; +System.out.print(x + " " + y); +``` + +# Choices + +- [ ] 1020 +- [ ] Error +- [x] 10 20 +- [ ] 30 + + +--- + +# Question +``` +int try = 10; +System.out.print(Try); +``` +# Choices + +- [ ] 10 +- [ ] Try +- [x] Error + +--- + + +# Question +``` +System.out.print(x); +int x = 10; +``` +# Choices +- [ ] x +- [ ] 10 +- [x] Error +- [ ] None of the above + +--- + + +**Rule:** In order to use a variable we need to declare and initialise it first. + +--- + + +# Question +``` +int x = 10; +System.out.print(x + y); +int y = 20; +``` +# Choices +- [ ] 30 +- [ ] 10y +- [x] Error +- [ ] None of them + + +--- + + +# Question +``` +int x = 10; +int x = 20; +System.out.print(x); +``` +# Choices +- [ ] 10 +- [ ] 20 +- [x] Error +- [ ] None of them + +--- + + +**Explanation:** +Here, when we write `int x = 10;`, we are declaring and initialising a variable "x". +Now when we write this statement, `int x = 20;`, again a variable is created of type int, and name x with value 20. +But this is not possible, we cannot have 2 variables with same name. + + +## **Rule:** We cannot have 2 variables with same name. + +--- + + +# Question +``` +int x = 20; +System.out.println(x); +x = 40; +System.out.print(x); +``` +# Choices +- [ ] 2040 +- [ ] Error +- [x] 20 40 + +--- + +**Explanation:** +Here, when we write `int x = 20;` , a variable is created of type int and name x. +But `x= 40` means we are not creating the variable, instead changing the value of the variable. This line will change the value of x to 40. + + +--- + + +# Question +``` +int x = 20; +int y = 40; +x = y + 10; +System.out.print(x); +``` + +# Choices + +- [ ] 70 +- [ ] 60 +- [x] 50 + +--- + + +**Explanation:** + +With very first line, ;, we are creating a variable of type int and name x. Again ; another variable is created of type int and name y. Then ; means update the value of x to 50. + +--- + + +# Question +``` +int x = 20,y = 40; +System.out.print(x + y); +``` +# Choices +- [ ] Error +- [ ] x + y +- [x] 60 + +--- + + + +**Explanation:** +Everytime in Java a statement ends with semicolon. +In this line there is a comma so we are trying to create a variable x and y of type int. + +**Rule:** We can create two multiple variables of same type in a single line seperated by comma. + +--- + + +# Question +``` +int x = 20;y = 40; +System.out.print(x + y); +``` +# Choices +- [x] Error +- [ ] x + y +- [ ] 60 + +--- + + + +**Explanation:** +Here semicolon is present after 20. That means with ; we are creating a variable and ; we are not declaring a variable. + + +--- + + +# Question +``` +int x = 20,y = 40,z = 80; +System.out.print(x + y + z); +``` +# Choices +- [ ] Error +- [ ] 150 +- [x] 140 +- [ ] None of them + +--- + + + +**Explanation:** +Here we are creating 3 variables which are seperated by commas which is possible. + +--- + + + +## Rules of Naming a variable: +1. Name can only contain lowercase[a - z], uppercase alphabets[A - Z], digits(0 - 9), '\$'{Dollar} or '_' {Underscore}, nothing else +2. Name cannot start with a digit +3. Cannot use reserve keywords as variable name : +Reserve keywords : Words which already have a predefined +meaning in java, they have a predefined use for them +Ex : public, static, void, int, etc : +4. Variable name is also case senstive. + +--- + + +# Question +``` +How many of them are correct variable names? +int x = 10; +int 1y = 20; +int x@a = 20; +``` +# Choices +- [x] 1 +- [ ] 2 +- [ ] 3 +- [ ] 0 + +--- + + +**Explanation:** +; here second rule is not followed, we are starting a variable name with a digit. This is a invalid variable name. +; this is also invalid because here we are having @ in variable name which is not allowed. + +--- + + +# Question +``` +How many of them are correct variable names? +int _y = 10; +int xxy = 20; +int x a = 20; +int y$z = 45; +``` + +# Choices +- [ ] 1 +- [ ] 2 +- [x] 3 +- [ ] 4 +- [ ] 0 + +--- + + +**Explanation:** +_y -> valid, +xxy -> valid +x a -> cannot have space in name, therefore invalid. +y\$z -> valid. + +--- + + +# Question +``` +int n = 20; +int N = 30; +System.out.print(n + N); +``` + +# Choices +- [x] 50 +- [ ] 2030 +- [ ] Error + +--- + + +**Explanation:** +Variables 'n' and 'N' are completely different, Java is case sensitive. + +--- + +# Question + +``` +int static = 40; +System.out.print(static); +``` + +# Choices +- [ ] 40 +- [ ] static +- [x] Error + +--- + + +**Explanation:** +"static" is reserve keyword. + + +--- + + +## Different categories of Data: +There are 3 categories of Data: +1. Text: + * String: words/sentences. + * char: 1 character +2. Numbers: + a. Decimal: + * float + * double + + b. Non-Decimal(Integers): + * byte: almost never used. + * short: almost never used. + * int + * long +3. Boolean: + * boolean + * True/False + +### Why We Need Multiple Datatype Under One Category: + + + + +All of them store water. +Difference lies in their storage capacity. + + + +| category | small | medium | large | +|:--------:|:----------:|:------:|:-----:| +| 500ml | yes [ideal] | yes | yes | +| 15L | no | no | yes | + + +--- + +### Int Vs Long: +They both have different range. + +**int:** + +**approx:** + + +**long:** + + +**approx:** + +--- + +# Question +Predict the output: +``` +int num = 100000; // 10^5 +System.out.print(num); +``` +# Choices +- [x] 100000 +- [ ] Error +- [ ] No clue! + +--- + + +**Explanation:** +Here we are creating a variable of type int, name num and value: 100000. +It is in the range if int. +Ans = 100000. + +--- + +# Question + +What will be the output? +``` +int x = 10000000000; //10^10 +System.out.print(x); +``` +# Choices +- [ ] 10000000000 +- [x] Error +- [ ] Too many zeroes! + +--- + +**Explanation:** +Error, Integer number too large. +Because 10^10 is out of range of int. + +--- + +# Question +Predict the output: +``` +long n = 10000000000; // 10^10 +System.out.print(n); +``` +# Choices +- [x] Error +- [ ] 10000000000 +- [ ] Choose me. I am best! + +--- + +**Explanation:** +Error: Integer number too large. + +**Rule:** whenever the compiler see a non decimal number it considers it as int. + +Now here, We are storing the value 10000000000 into long, But as soon as compiler see the non decimal digit it consider it as int and which is out of range of int. Therefore we get error. + +--- + +# Question +Predict the output: +``` +long a = 10000000000L; //10^10 +System.out.print(a); +``` + +# Choices +- [ ] Error +- [ ] a +- [x] 10000000000 +- [ ] 10000000000L + +--- + +**Explanation:** +When we write "L" in front of the number it is telling the compiler that consider this number as long, not int. + +--- + +# Question +Predict the output: +``` +long a = 10000000000l; //10^10 +System.out.print(a); +``` + +# Choices +- [ ] Error +- [ ] 10000000000l +- [x] 10000000000 +- [ ] Too tired to count zeroes! + +--- + +**Explanation:** +Either use "L" or "l", both will work. + + +---- + +## TypeCasting: +Typecasting means converting one datatype to another. +Basically, Tranfering data from one container to another. + +**Anology:** + + + +1. We can easily transfer water from 5L bucket to 20; bucket. +From smaller storage to higher storage, we can easily do it. + + + +2. We can again transfer water from 20L bucket to 5L bucket, if the water level is less than 5L. + + + +3. We have 8L of water in 20l bucket, now this time when we try to transfer it to 5L bucket, overflow will happen. Water will flow outside of the bucket as well. It will spill. + +**Replicate the example with data types:** +5L bucket: int +20L bucket: long. + +4. Easily transfer data from int(smaller) to long(bigger). + +--- + +# Question +``` +int a = 1000; +long b = a; +System.out.print(b); +``` +# Choices +- [x] 1000 +- [ ] Error + +--- + +**Explanation:** +Here,`int a = 1000;` we are trying to create a int type variable of name a, value 1000. +Now `long b = a;` with this we create a long type variable, name b. +b = 1000. +And we can easily store 1000 in long. + +**It is Implicit/Widening TypeCasting(automatic).** + +--- + +# Question +``` +long x = 10000; +System.out.print(x); +``` + +# Choices +- [x] 1000 +- [ ] Error + +--- + +**Explanation:** +Java considers non decimal number as int. +Therefore, the value 10000 is considered as int and we are trying to store int value into long which is possible. +Int to Long is implicit typecasting. + +--- + +# Question + +``` +long x = 10000; +int y = x; +System.out.print(y); +``` + +# Choices +- [ ] 1000 +- [x] Error + +--- + +**Explanation:** +`long x = 10000` It is implicit typecasting. +But, `int y = x;` Here we are trying to store long value into int container. +Error: Possible lossy conversion. + +--- + +# Question +``` +long x = 1000; +int y = (int)x; +System.out.print(y); +``` + +# Choices +- [x] 1000 +- [ ] Error + +--- + +**Explanation:** + +Here we are doing Explicit/Narrowing Typecasting from long to int. + + +--- + +# Question + +``` +long a = 10^10; +int b = (int)a; +System.out.print(b); +``` + +# Choices +- [ ] 10^10 +- [ ] 10^10L +- [x] Error +- [ ] Some random value + +--- + +**Explanation:** + +Here, value 10^10 is too large for int. +Ans = Error, Integer number too large. + + +--- + +# Question +``` +long a = 10^10L; +int b = (int)a; +System.out.print(b); +``` + + +# Choices +- [ ] 10^10 +- [ ] 10^10L +- [ ] Error +- [x] Some random value + +--- +**Explanation:** + +Here, We are specifying L so compiler considers 10^10 as long only and then we are trying to store in a long container only which is possible. +After that in next line we are doing explicit typecasting, but then also we know that this number is out of range of int. +We are actually forcing the compiler to do it, data loss will happen. + +--- +Some quizzes to revise + +--- + +# Question + +``` +int a = (int)10000000000L; +System.out.print(a); +``` + +# Choices +- [x] Some Random Value +- [ ] Error +- [ ] Very Complicated + +--- + + +# Question + +``` +int a = (int)10000000000; +System.out.print(a); +``` + +# Choices +- [ ] Some Random Value +- [x] Error +- [ ] 10000000000 + diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner Patterns 1.md b/Academy DSA Typed Notes/Beginner Language/Beginner Patterns 1.md new file mode 100644 index 0000000..4b66446 --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner Patterns 1.md @@ -0,0 +1,597 @@ +# Patterns Introduction +--- + +## Agenda + +**Some abbreviations that will be used in this class:** +* System.out.print - SOP +* System.out.println - SOPln + + + +We will work with patterns today. After this class, the students will feel very comfortable with loops. +1. Print stars in a single row +2. Print a square +3. Print a rectangle +4. Print staircase +5. Print reverse staircase +6. Print special pattern + + + +--- + +# Question +Loop to print " * " N times in a single row? +Ex: N = 5, print ***** +N = 9, print ********* + +# Choices +- [x] for(int i = 1; i <= N; i++) { +SOP(" * "); +} +- [ ] for(int i = 1; i < N; i++) { +SOP(" * "); +} +- [ ] for(int i = 0; i <= N; i++) { +SOP(" * "); +} + + + +--- + +## Explanation + +```java +for(int i = 1; i <= N; i++) { + SOP(" * "); +} +``` +This choice is correct. The code uses a loop to iterate from `i = 1` to `i = N` (both inclusive). In each iteration, it prints the "*" character using the `SOP("*");` statement. This loop will print "*" N times in a single row, as desired. + + +Certainly, let's take a look at why the other two choices are incorrect: + +1. **Incorrect Choice 2:** + ```java + for (int i = 1; i < N; i++) { + SOP(" * "); + } + ``` + **Explanation:** This code uses a loop that starts from `i = 1` and continues until `i` is less than `N`. In each iteration, it prints an asterisk. However, this loop only iterates `N - 1` times, which means it will print one less asterisk than the desired value. For example, if `N` is 5, this loop will print `****` (4 asterisks) instead of `*****`. + +2. **Incorrect Choice 3:** + ```java + for (int i = 0; i <= N; i++) { + SOP(" * "); + } + ``` + **Explanation:** This code uses a loop that starts from `i = 0` and continues until `i` is less than or equal to `N`. In each iteration, it prints an asterisk. However, this loop iterates `N + 1` times, which means it will print one more asterisk than the desired value. For example, if `N` is 5, this loop will print `******` (6 asterisks) instead of `*****`. + + +--- + + +### Example 1 + +This is the quiz question. +Print N starts " * " in a single row. +N = 5, ***** +N = 4, **** +N = 2, ** + +**Q.** What should be the number of iterations? +**A.** "N" + + +**Code:** + +``` + public static void main() { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + for (int i = 1; i <= n; i++) { + System.out.print(" * "); + } + } +``` +Dry run the codes and justify why Option 1 is correct for some values of N. + +--- + +### Example 2 +Print a square (N * N) of stars. + +For example, + +N = 4 +```plaintext +**** +**** +**** +**** +``` + +N = 5 +```plaintext +***** +***** +***** +***** +***** +``` + +**Q.** If you have to repeat a single task N number of tasks, how to do that? +**A.** We can write a loop. + + +Now, this questions is similar to repeating 1st task N number of times. +So, the code can be: + +``` +for (int i = 1; i <= N; i++) { + for (int i = 1; i <= N; i++) { + SOP(" * "); + } + SOPln(); +} +``` + +Ask students if this code is correct. It's not, because we cannot repeat variable 'i' in java. +So, the final correct code is: + +``` +for (int i = 1; i <= N; i++) { + for (int j = 1; j <= N; j++) { + SOP(" * "); + } + SOPln(); +} +``` + +Explain why we need `SOPln()` after the 2nd for loop. + +**Explanation:** +Without the `SOPln()` statement after the inner loop, all the asterisks would be printed in a single continuous line, and the pattern would not be formed with rows and columns. The `SOPln()` call ensures that each row of asterisks is printed on a new line, creating the desired pattern. + +Dry run the above code for N = 3. + + + + + +--- + +### Example 3 +Print rectangle of N * M having stars. +N rows having M stars in each row. + +For example, + +N = 4, M = 3 +```plaintext +*** +*** +*** +*** +``` +N = 2, M = 4 +```plaintext +**** +**** +``` + +Outer loop -> N times +Inner loop -> M times + +The correct code is: +``` +for (int i = 1; i <= N; i++) { + for (int j = 1; j <= M; j++) { + SOP(" * "); + } + SOPln(); +} +``` + +**Note:** Mention that the starting values does not matter. Just that the number of iterations should be N. + +Dry run for N = 2, M = 3. + + + + +**Observation Table:** + +| Row | Stars | +|:---:|:-----:| +| 1 | 3 | +| 2 | 3 | + + +ith row => M stars +and a total N rows + + +--- + +### Example 4 +Print staircase pattern. +For example, + +N = 4 +```plaintext +* +** +*** +**** +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +Observe for each row number i, we have i stars in that row. + +Outer Loop -> N times +Inner Loop -> i times +Inner loop does not work for constant number of times. + +**Observation Table:** + +| Row | Stars | +|:---:|:-----:| +| 1 | 1 | +| 2 | 2 | +| 3 | 3 | +| 4 | 4 | +| 5 | 5 | + + +ith row => i stars + + +The correct code is: +``` +for (int i = 1; i <= N; i++) { + + // Loop to print i stars. + for (int j = 1; j <= i; j++) { + SOP(" * "); + } + SOPln(); +} +``` + +Dry run this code for N = 4 (Given image is incomplete). +You may complete the dry run or stop in-between according to the batch. + + + + +--- + + +### Example 5 + +> **Note for instructor:** Give some context of why we are learning this approach. Like, as similar approach will work in majority of pattern questions + +Print reverse staircase pattern. +For example, +N = 4 +```plaintext +**** +*** +** +* +``` + +N = 5 +```plaintext +***** +**** +*** +** +* +``` + +For N = 5, we are printing stars in the following manner. + + + +Row + star = N + 1 +So, star = N + 1 - Row +Observe for each row number i, we have N - i + 1 stars in that row. + +Outer Loop -> N times +Inner Loop -> N - i + 1 times +Inner loop does not work for constant number of times. + +The correct code is: +```java +for (int i = 1; i <= N; i++) { + + // Loop to print N - i + 1 stars. + for (int j = 1; j <= N - i + 1; j++) { + SOP(" * "); + } + SOPln(); +} +``` + +Dry run the code for N = 3. + + + +--- + + +#### Another Approach + + + +In this approach, we will change the starting value of i itself. + +The correct code is: +``` +for (int i = N; i >= 1; i--) { + + // Loop to print i stars. + for (int j = 1; j <= i; j++) { + SOP(" * "); + } + SOPln(); +} +``` + + +--- + +### Example 6 +Print the diamond pattern. + +For example, +N = 5 + +```plaintext +********** +****--**** +***----*** +**------** +*--------* +*--------* +**------** +***----*** +****--**** +********** +``` + + + +You are only supposed to print star " * ", but not underscores (they should be spaces). + +If N = 5, so 10 rows are needed. + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +The pattern can be broken into two halves. + + + +Again, we can break this pattern into halves again. + + + +For the right quarter, we need to print some spaces first and then stars. +The table shows for each row, how many spaces and stars need to be printed. + + + +Combining everything for the first half, we have the following table. + + + +In one single row, + +print (N + 1 - i) stars + (i - 1) spaces + (i - 1) spaces + (N + 1 - i) stars + +So, print (N + 1 - i) stars + 2 * (i - 1) spaces + (N + 1 - i) stars +So, let's write the code for the upper half using the above facts. + +``` +for (int i = 1; i <= N; i++) { + + // In each row, print N + 1 - i stars. + for (int j = 1; j <= N + 1 - i; j++) { + SOP(" * "); + } + + // In each row, (i - 1) spaces. + for (int j = 1; j <= 2 * (i - 1); j++) { + SOP(" _ "); + } + + // In each row, print N + 1 - i stars. + for (int j = 1; j <= N + 1 - i; j++) { + SOP(" * "); + } + SOPln(); +} +``` + +**Lower Half:** + + + +For lower part, we can directly write the following table: + + + + +In one single row, +print i stars + print (N - i) spaces + print (N - i) spaces + i stars + +So, print i stars + print 2 * (N - i) spaces + i stars +So, let's write the code for the upper half using the above facts. + +``` +for (int i = 1; i <= N; i++) { + + // In each row, print N + 1 - i stars. + for (int j = 1; j <= i; j++) { + SOP(" * "); + } + + // In each row, (i - 1) spaces. + for (int j = 1; j <= 2 * (N - i); j++) { + SOP(" _ "); + } + + // In each row, print N + 1 - i stars. + for (int j = 1; j <= i; j++) { + SOP(" * "); + } + SOPln(); +} +``` + +Combining these 2 codes we get, the diamond pattern. + + +--- + + +### Example 7 +Print the following pattern: + +For example, + +N = 5 +```plaintext +1 +2 3 +4 5 6 +7 8 9 10 +11 12 13 14 15 +``` + +N = 4 +```plaintext +1 +2 3 +4 5 6 +7 8 9 10 +``` + +We will create a variable and print that variable. After printing, we increment it. + +``` +int val = 1; +for (int i = 1; i <= N; i++) { + for (int j = 1; j <= i; j++) { + SOP(val); + val++; + } + SOPln(); +} +``` + + +**Explanation:** + +In the given approach we have initialized a variable `val` to 1. It employs an outer loop that iterates from 1 to N, governing the rows. Within this loop, an inner loop runs from 1 to the current value of the outer loop index, controlling the values within each row. It prints the value of `val`, increments it, and then proceeds with the next iteration of the inner loop. This structure creates a pattern where each row holds an increasing sequence of numbers. The `SOPln()` statement at the end of the outer loop iteration ensures a new line for the subsequent row. By iteratively printing values and managing rows through nested loops, the code systematically generates the desired pattern of numbers. + + +--- + + +### Example 8 +Print the following pattern: +For example, + +N = 5 +```plaintext +1 +1 2 +1 2 3 +1 2 3 4 +1 2 3 4 5 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +**Approach 1:** +``` +for (int i = 1; i <= N; i++) { + + int val = 1; + for (int j = 1; j <= i; j++) { + SOP(val); + val++; + } + SOPln(); +} +``` + +**Approach 2:** +In this approach instead of taking an extra variable we can directly print j. +``` +for (int i = 1; i <= N; i++) { + for (int j = 1; j <= i; j++) { + SOP(j); + } + SOPln(); +} +``` + +--- + + +### Example 9 + +Print the following pattern. +For example, + +N = 5 +```plaintext +1 +2 3 +3 4 5 +4 5 6 7 +5 6 7 8 9 +``` + +The pattern now starts at each row with that row number. So, only 1 change is required i.e, in the initial value of val. + +The correct code for this pattern is: +``` +for (int i = 1; i <= N; i++) { + + int val = i; + for (int j = 1; j <= i; j++) { + SOP(val); + val++; + } + SOPln(); +} +``` + +--- \ No newline at end of file diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner Patterns 2 & Introduction to Strings.md b/Academy DSA Typed Notes/Beginner Language/Beginner Patterns 2 & Introduction to Strings.md new file mode 100644 index 0000000..9149d7b --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner Patterns 2 & Introduction to Strings.md @@ -0,0 +1,550 @@ +# Beginner: Patterns 2 & Introduction to Strings + +--- + +### Agenda + +1. Print reverse triangle V +2. Print numeric triangle /\ +3. Strings +4. next() vs nextLine() +5. How to deal with different type of inputs +6. Character Pattern + +--- + +### Problem Statement +Print the following pattern: + +For example, + +N = 5 +``` +* * * * * + * * * * + * * * + * * + * +``` + +N = 4 +``` +* * * * + * * * + * * + * +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Observation +Lets consider the spaces as "_" +``` +* _ * _ * _ * _ * _ +_ * _ * _ * _ * _ +_ _ * _ * _ * _ +_ _ _ * _ * _ +_ _ _ _ * _ +``` + +Now lets assume we are removing the spaces after every '*', then +``` +* * * * * +_ * * * * +_ _ * * * +_ _ _ * * +_ _ _ _ * +``` + + +While printing stars, remember to print a space after every star, to get the our required reverse triangle pattern. + +### Code + +```java +for (int i = 0; i < N; i++) { + + //loop to print i spaces + for (int j = 1; j <= i; j++) { + System.out.print(" "); + } + + //loop to print n-i stars + for (int j = 1; j <= n - i; j++) { + System.out.print("* "); + } + + System.out.println(); +} +``` + + +--- + +### Problem Statement +Print the following pattern: + +For example, + +N = 5 +``` +0 0 0 0 1 0 0 0 0 +0 0 0 2 3 2 0 0 0 +0 0 3 4 5 4 3 0 0 +0 4 5 6 7 6 5 4 0 +5 6 7 8 9 8 7 6 5 +``` +N = 4 +``` +0 0 0 1 0 0 0 +0 0 2 3 2 0 0 +0 3 4 5 4 3 0 +4 5 6 7 6 5 4 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Approach + +Lets divide the pattern into two halfs, + + + +Lets consider the 2 halves separately, + +### First Half + +| **0** | **0** | **0** | **0** | **1** | +|-------|-------|-------|-------|-------| +| **0** | **0** | **0** | **2** | **3** | +| **0** | **0** | **3** | **4** | **5** | +| **0** | **4** | **5** | **6** | **7** | +| **5** | **6** | **7** | **8** | **9** | + +Lets create a table, on observing the pattern. +| row | zeros | start | end | +|-----|---------|-------|-----------| +| 1 | 4 [5-1] | 1 | 1 [2\*1-1] | +| 2 | 3 [5-2] | 2 | 3 [2\*2-1] | +| 3 | 2 [5-3] | 3 | 5 [2\*3-1] | +| 4 | 1 [5-4] | 4 | 7 [2\*4-1] | +| 5 | 0 [5-5] | 5    | 9 [2\*5-1] | + +We can come up with an generalized pattern on observing the values of the table based on the value i. + +| ith row | (n - i) zeros | starts with i | ends with 2 * i - 1 | +|---|---|---|---| + +### Psuedo code for First Half + +```java +// Printing (n - i) zeros +for (int j = 1; j <= n - i; j++){ + System.out.print(0 + " "); +} + +int lim = 2 *i - 1; +// Printing the increasing numbers from i to 2*i-1 +for (int j = i; j <= lim; j++){ + System.out.print(j + " "); +} +``` + +### Second Half + +| **0** | **0** | **0** | **0** | +|-------|-------|-------|-------| +| **2** | **0** | **0** | **0** | +| **4** | **3** | **0** | **0** | +| **6** | **5** | **4** | **0** | +| **8** | **7** | **6** | **5** | + +Lets create a table, on observing the pattern. + +| row | start | end | zeros | +|-----|-----------|-----|-------| +| 1 | | | 4 | +| 2 | 2 [2\*2-2] | 2 | 3 | +| 3 | 4 [2\*3-2] | 3 | 2 | +| 4 | 6 [2\*4-2] | 4 | 1 | +| 5 | 8 [2\*5-2] | 5   | 0     | + +We can come up with an generalized pattern on observing the values of the table based on the value i. + +| ith row | starts with (i * 2 - 2) | ends with i | (n i) zeros | +|---|---|---|---| + +Here **starts with (i * 2 - 2)** can be even simplified, by using the end value of the previous calculation as **end - 1**. + + +### Psuedo code for Second Half + +```java +// For the Second Half +// Printing the decreasing numbers +int lim = 2 *i - 1; +for (int j = lim - 1; j >= i; j--){ + System.out.print(j + " "); +} + +//loop to print n - i zeros +for (int j = 1; j <= n - i; j++){ + System.out.print(0 + " "); +} +``` + + + + +### Overall Code + +``` java +for (int i = 1; i <= n; i++){ + + // For the First Half + //loop to print n - i zeros + for (int j = 1; j <= n - i; j++){ + System.out.print(0 + " "); + } + + int lim = 2 *i - 1; + // Printing the increasing numbers from i to 2*i-1 + for (int j = i; j <= lim; j++){ + System.out.print(j + " "); + } + + // For the Second Half + // Printing the decreasing numbers + for (int j = lim - 1; j >= i; j--){ + System.out.print(j + " "); + } + + //loop to print n - i zeros + for (int j = 1; j <= n - i; j++){ + System.out.print(0 + " "); + } + + System.out.println(); +} +``` + + + +--- + +### Reading Inputs for Strings + +**1. sc.next()-> cannot take spaces as input** + +Ques1: +```java +Input: "Hello World" +String s1 = sc.next(); +System.out.println(s1); + +String s2 = sc.next(); +System.out.println(s2); +``` +Output: +```plaintext +Hello +World +``` + +Explanation: + +s1 will have first word, Hello +s2 will have next word, World + + + + +**2. sc.nextLine() -> can take spaces as well, until next line is encountered.** + +Ques1: +```java +Input: Hello World +String s3 = sc.nextLine(); +System.out.println(s3); +``` + +Output: +```plaintext +Hello World +``` + +--- + +# Question +Input : + +``` +Hello World +``` +``` +Scanner scn = new Scanner(System.in); +String str1 = scn.next(); +String str2 = scn.next(); +System.out.println(str1); +System.out.println(str2); +``` + +# Choices + +- [x] Hello
World +- [ ] Hello +- [ ] World +- [ ] None of the above + +--- + +Output: +```plaintext +Hello +World +``` + + +Explanation: + +str1 will have, Hello +str2 will have next word, World + + +--- + +# Question + +Input: +``` +Hello Welcome in Scaler +``` + +``` +Scanner scn = new Scanner(System.in); +String str1 = scn.next(); +String str2 = scn.nextLine(); +System.out.println(str1); +System.out.println(str2); +``` + +# Choices + +- [ ] Hello +- [ ] Error +- [x] Hello
Welcome in Scaler +- [ ] None of the above + +--- + +Output: +```plaintext +Hello +Welcome in Scaler +``` + +Explanation: + +str1 will have first word, Hello +str2 will have complete line after hello, Welcome in scaler(including space before welcome). + +--- + +**Rule:** When the inputs are given in separate lines, and we take a String input using nextLine() after taking number input[nextInt(), nextLong(), nextFloat(), nextDouble()] or a single word [next()] then we get a empty String. + +### Example + +### Input +``` +45 +Hello World! +``` +``` java +Scanner sc = new Scanner(System.in); +int x = sc.nextInt(); // x[45] +String st = sc.nextLine(); // st -> Empty String +String st2 = sc.nextLine(); // st2 -> "Hello World!" +System.out.println(st); +System.out.println(s2); +``` + +### Output +``` + +Hello World! +``` +--- + + +# Question + +Predict the output : +``` +Input- +11 +Super Excited! +``` +``` +Scanner scn = new Scanner(System.in); +int x = scn.nextInt(); +String str = scn.nextLine(); +System.out.println(x); +System.out.println(str); +``` + +# Choices + +- [ ] 11 Super Excited! +- [ ] Error +- [ ] 11
Super Excited! +- [x] 11 + +--- + + + +# Question + +Predict the output : +``` +Input- +11 +Super Excited! +``` +``` +Scanner scn = new Scanner(System.in); +int x = scn.nextInt(); +String str = scn.nextLine(); +System.out.println(x); +System.out.println(str); +System.out.println("The End"); +``` + +# Choices + +- [ ] 11 Super Excited! The End +- [x] 11

The End +- [ ] Error +- [ ] 11
Super Excited!
The End + + +--- + + +### Character: +A character represent a single symbol. + +There are different types of characters: +* Uppercase characters : ['A' - 'Z'] +* Lowercase characters : ['a' - 'z'] +* Numeric characters: ['0' - '9'] +* Special characters: ['@', '#', '\$', '%', '&'...] + +There are a total of 128 characters. + + +### Syntax + +**Example 1:** +```java +char ch = 'a'; +System.out.println(ch); +``` +**Output:** +```plaintext +a +``` + +**Example 2:** +```java +char ch = 'ab'; +System.out.println(ch); +``` +**Output:** +```plaintext +Error: Only a single symbol is a character. +``` + +--- + + +### Problem Statement +Write a program to print all characters from A to Z. + + + +### Code +```java +public static void printCharacters(String str) { + for(char i = 'A'; i <= 'Z'; i++) { + System.out.println(i); + } +} +``` +--- + + +### Character Stairacase Pattern + +N = 5 +``` +A +A B +A B C +A B C D +A B C D E +``` + +N = 3 +``` +A +A B +A B C +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + +### Approach +Consider the spaces as underscores (for better visualization). + +Lets take N = 5, +``` +A _ +A _ B _ +A _ B _ C _ +A _ B _ C _ D _ +A _ B _ C _ D _ E _ +``` + +Lets assume we are printing the standard stair case pattern, + +``` +1 +1 2 +1 2 3 +1 2 3 4 +1 2 3 4 5 +``` + +Now both the patterns is similar. So, instead of printing numbers, we just create a new variable, which starts with **A**, then increment inside the innerloop. + + +### Code + +``` java +for (int i = 1; i <= N; ++i) { + char ch = 'A'; + for (char j = 1; j <= i; j++) { + System.out.print(ch + " "); + ch++; + } + System.out.println(); +} +``` +--- diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 1.md b/Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 1.md new file mode 100644 index 0000000..bd2f2ff --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 1.md @@ -0,0 +1,688 @@ +# 1D Arrays 1 + +--- +## Agenda + +1. Introduction to Arrays +2. Reading Input +3. Indexing and Properties +4. Sum of all elements +5. Frequency of k in array +6. Max of all elements + + +--- + +### Example +Let's say we need to read four inputs for our programme. We can use the below approach. + +#### Code +```java +public static void main(String[] args) { + int a, b, c, d; + Scanner scanner = new Scanner(System.in); + a = scanner.nextInt(); + b = scanner.nextInt(); + c = scanner.nextInt(); + d = scanner.nextInt(); +} +``` +Some one can suggest that we should use loop to get all four values like :- + +#### Code +```cpp +public static void main(){ + for(int i = 1; i <= 4;i ++ ){ + int a = sc.nextInt(); + } +} + +``` +The above provided approach is wrong because what we are doing is updating the value of variable `a` in each iteration due this a would be set to the last input value provided. + +--- + + + +### Concept of Arrays +* In above example what is instead of four there are hundreds of value to store. It would be manually infeasible to declare and set hundreds of variables. +* Therefore to overcome above problem we use **arrays** + +#### Array +It is a data structure that can hold fixed number of values of same data type. + +#### Syntax +```cpp +datatype name[] = new datatype[size] + +// example +float f[] = new float[10] +int arr[] = new int[10] + +// Various ways +datatype[] name = new datatype[size] +datatype []name = new datatype[size] +``` + +--- + + + +# Question + +Correct way to create an Array containing 5 int values in Java? + +# Choices + +- [x] int[] ar = new int[5] +- [ ] int[] ar = new int[4] +- [ ] int[] ar = int new[5] + +--- + + + +## Explanation + +Since size is 5 and datatype is int using above provided syntax rules: +int[] ar = new int[5] + +--- + + + +### Indexing and Properties + +* Indexing in array starts from **0**. + + +| index | 0 | 1 | 2 | 3 | +|:-----:|:---:|:---:|:---:|:---:| + +* Accessing an element at **ith** index in an array can be done as follows:- +```cpp + nameOfArray[i] +``` + + + + + +--- + +# Question + +`int[] ar = new int[6];` + +How can we access last position element ? + +# Choices +- [x] ar[5] +- [ ] ar[6] +- [ ] ar[4] +- [ ] ar[7] + + +--- + + +## Explanation + +Since size is 6 indexing would be like :- + +| index | 0 | 1 | 2 | 3 | 4 | 5 | +|:-----:|:---:|:---:|:---:|:---:|:---:|:---:| +| arr | 0 | 0 | 3 | 0 | 0 | 0 | + +last element would be at index 5 + +--- + + +# Question +`int[] ar = new int[10];` + +How can we access last position element ? + +# Choices +- [x] ar[9] +- [ ] ar[10] +- [ ] ar[7] +- [ ] ar[8] + +--- + +## Explanation + +Since size is 10 indexing would be like :- + +| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +|:-----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| ar | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + +last element would be at index 9 + +--- + + + +# Question +Say int[] ar = new int[N] +How to access first element and last element ? + +# Choices +- [x] ar[0] ar[N-1] +- [ ] ar[0] ar[N] +- [ ] ar[1] ar[N] + +--- + + +## Explanation +By observing previous questions we can generalize the idea that :- +* Last element in array 'arr' of size 'N' is accessed as `arr[N-1]`. +* First element in array 'arr' of size 'N' is accessed as `arr[0]`. + + + +--- + + +# Question +What is the Output of +```java +public static void main(String args[]) { + int[] arr = new int[10]; + int n = arr.length; + System.out.println(n); +} +``` + +# Choices +- [x] 10 +- [ ] 9 +- [ ] 8 + + +--- + +* By default values in an array of type `int` are intialized with **'0'** + + + +--- + +# Question + +What will be the output? +```java +public static void main(String args[]) { + int[] arr = new int[5]; + arr[0] = 10; + arr[1] = 20; + + int sum = 0; + for(int i = 0; i < 5;i ++ ) { + sum += arr[i]; + } + + System.out.println(sum); +} +``` + +# Choices +- [x] 30 +- [ ] error +- [ ] 20 +- [ ] 43 + +--- + + +## Explanation +By observing previous questions we can generalize the idea that :- +* Last element in array 'arr' of size 'N' is accessed as `arr[N-1]`. +* First element in array 'arr' of size 'N' is accessed as `arr[0]`. + + +#### Solution + + + + + +--- + + +# Question + +```java +public static void main(String args[]) { + int[] arr = new int[5]; + System.out.println(arr[0]); +} +``` + +# Choices +- [x] 0 +- [ ] error +- [ ] random number +- [ ] 43 + + + + +--- + + +# Question + +```java +public static void main(String args[]) { + int[] ar = new int[3]; + ar[0] = 10; + ar[1] = 20; + ar[2] = 30; + System.out.print(ar[0] + ar[3]); +} +``` + +# Choices +- [x] error +- [ ] 0 +- [ ] 40 +- [ ] 60 + + + +--- + +# Question + +```java +public static void main(String args[]) { + int[] ar = new int[3]; + ar[0] = 10; + ar[1] = 20; + ar[2] = 30; + System.out.print(ar[0] + ar[2]); +} +``` + +# Choices +- [x] 40 +- [ ] 0 +- [ ] error +- [ ] 60 + + + +--- + +# Question + +```java +public static void main(String args[]) { + int[] ar = new int[3]; + ar[0] = 10; + ar[1] = 20; + ar[2] = 30; + System.out.print(ar[-1] + ar[3]); +} + +``` + +# Choices +- [x] error +- [ ] 0 +- [ ] 40 +- [ ] 60 + +--- + + +We can reassign an array to replace the previous value it was referencing. + + +**Code:** +```java +public static void main(){ + int[] ar = new int[6]; + ar= new int[2]; + S.O.Pln(arr.length); +} +``` +**Output:** +```plaintext +2 +``` + + + +--- + +* We can directly store elements into an array + +**Code:** +```java +int ar[] = {10,20,30}; +``` + + +--- + +### Creating and Reading an array + +#### Create an array of size 4 and print sum of all it's element :- + +* Let's create an array of size 4 and take input. + +```java +public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + int[] arr = new int[4]; + arr[0] = sc.nextInt(); + arr[1] = sc.nextInt(); + arr[2] = sc.nextInt(); + arr[3] = sc.nextInt(); +} +``` + +* In above approach we have to take input for each index manually which is not a good idea. +* So **How can we take inputs efficiently ?** + * **Solution** :- We use a loop. + * But **how to apply loop to take array input ?** +* On observing above approach we will find that only index changes each time we take an input. + * **In each iteration we change the index number.** + * We iterate starting from 0 till last index i.e. array size -1. + +```java +public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + int[] arr = new int[4]; + for (int i = 0; i < 4; i ++ ) { + arr[i] = sc.nextInt(); + } +} +``` + + +--- + + + +### Passing Array to Functions + +#### Create a Function Which Takes arr[] as A Parameter and Print the Array + +* We need to declare a function which takes array as parameter to function. + * It can be done like :- + `Function nameOfFunction(dataType anyName[]){}` + * '`[]`' are important for distinguishing array type parameter from other variable type parameters. +* **How can we access the length of array from function ?** + * We use `array.length` for this purpose. +* We can pass array parameter to function call like: + `functionName(arrayName)` + * **We only need to pass array name.** + +```java +static void printArray(int[] ar) { + int n = ar.length; + for (int i = 0; i < n; i ++ ) { + System.out.print(ar[i] + " "); + } + System.out.println(); +} + +public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + int[] arr = new int[4]; + for (int i = 0; i < 4; i ++ ) { + arr[i] = sc.nextInt(); + } + printArray(arr); +} +``` +We take the sum of all elements of array as follows :- + +```java +public static void main(String[] args) { + int[] arr = new int[4]; // creates an array of size 4 + Scanner scanner = new Scanner(System.in); + + for (int i = 0; i < 4; i ++ ) { + arr[i] = scanner.nextInt(); + } + int sum = 0; + for (int i = 0; i < 4; i ++ ) { + sum += arr[i]; // add element at ith index to sum variable + } + + System.out.println(sum); + } + +``` + +--- + + +### Problem 1 + +Given an array and k. Write a function to return the frequency of k in array? + +#### Testcase + +```java +arr[7] = [3,6,7,6,11,6,14] + +k = 6 +``` + +#### solution + +```plaintext +ans = 4 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Approach +* We need to create a function and pass array and k as parameters to the function. +* Inside the function :- + * Maintain a count variable which is intialised to 0. + * Iterate over the array:- + * If element at current index equals k increament count by 1. + * Return count. + +#### Trace + +![]() + + +#### Solution + + + +#### Pseudeocode +```cpp +static int frequencyK(int[] ar, int k) { + int n = ar.length; + int count = 0; + for (int i = 0; i < n; i ++ ) { + if (ar[i] == k) { + count ++ ; + } + } + return count; +} +``` + +--- + + +### Problem 2 + +Given an array . Write a function to return the maximum element present in array? + +#### Testcase 1 + +```cpp +arr[6] = [3,1,7,6,9,11] + +``` + +#### solution + +```plaintext +ans = 11 +``` +#### Testcase 2 + +```plaintext +arr[6] = [4,2,7,9,12,3] + +``` + +#### solution + +```plaintext +ans = 12 +``` + +:::warning +Please take some time to think about the solution approach on your own before reading further..... +::: + + +#### Approach 1 +* We need to create a function and pass array as parameters to the function. +* Inside the function :- + * Maintain a max variable which is intialised to 0. + * Iterate over the array:- + * If element at current index is greater than max then set max to current element. + * Return max. + +#### Trace 1 + + + + +![]() + +#### Trace 2 + + + + + + +#### Code +```java + static int maxElement(int array[]) { + int n = array.length; + int max = Integer.MIN_VALUE; // Initialize max with the smallest possible integer value + for (int i = 0; i < n; i ++ ) { + if (array[i] > max) { + max = array[i]; + } + } + return max; +} +``` + +**There is a flaw in above code.** Let's see it with help of an testcase. + +#### Testcase 3 + +```cpp +arr[4] = [ - 8, - 4, - 3, - 5] + +``` + +#### solution + +```cpp +ans = - 3 +``` + +* Let' apply approach 1 to testcase 3 + + + + + + +* In trace we get the answer as 0 whereas the correact answer is -3. **Why ?** + +#### Issue + +**Since max/ans variable is intialised to 0 which is already greater than all elements in array therefore max/ans is not updated.** + + +--- +# Question + + +For taking sum of N numbers we initialise our sum variable with = + +# Choices +- [x] 0 +- [ ] 9 +- [ ] 1 + + + +--- +title: Quiz 13 +description: +duration: 30 +card_type : quiz_card +--- +# Question + +For taking product of N numbers we initialise our product variable with `=` + + +# Choices +- [ ] 0 +- [ ] 9 +- [x] 1 + + + +--- + +* Based upon observations from above questions we need to intialize max/ans in such a manner that it won't affect the answer. +* We intialize the ans/max variable to **- ∞**(negative infinity) so that it does not affect the final answer. + * We do this by **Integer.MIN_VALUE** + + + + + + +#### Code + +```java +static int maxElement(int[] ar) { + int n = ar.length; + int max = Integer.MIN_VALUE; + + for (int i = 0; i < n; i ++ ) { + if (ar[i] > max) { + max = ar[i]; + } + } + return max; +} +``` \ No newline at end of file diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 2.md b/Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 2.md new file mode 100644 index 0000000..823999f --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner 1D Array - 2.md @@ -0,0 +1,606 @@ +# 1D Array - 2 + +# Agenda + +1. Revision +2. Implement Function +3. Increasing Order [increasing and non-decreasing] +4. Drawbacks of Array +5. Right shift of the array +6. Array List introduction +7. Functions [add, get, set, remove, size, sort] +8. ArrayList functions via code +9. Write a function which takes arrayList as input and update all values by 1 +10. Return an arraylist with all even numbers + + +--- + + +## Revision + +Let us revise what we discussed in the last class wit the help of quizzes. + +--- + + +# Question +What will be output for this program ? +```java +int[] myArray = {1, 2, 3, 4, 5}; +System.out.println(myArray[2]); +``` + + +# Choices +- [ ] 2 +- [x] 3 +- [ ] 4 + +--- + + +# Question +What will be output for this program ? + +```java +int[] myArray = new int[3]; +System.out.println(myArray[1]); +``` + + + +# Choices +- [x] 0 +- [ ] Null +- [ ] Error + + +--- + +# Question +What will be output for this program ? +```java +int[] myArray = {1, 2, 3, 4, 5}; +System.out.println(myArray.length); +``` + + + +# Choices +- [ ] 4 +- [ ] 0 +- [x] 5 + +--- + + +# Question +What will be output for this program ? +```java +int[] myArray = {1, 2, 3, 4, 5}; +myArray[2] = 6; +System.out.println(myArray[2]); +``` + + +# Choices +- [x] 6 +- [ ] 3 +- [ ] 3 +- [ ] Error + + + +--- + + +## Return arr[] Syntax + +### Implement Function + +Given N, create an array of size N, which should contain all elements in increasing order from 1 to N. + +## Example + +```plaintext +N = 3 +arr[3] = { 1, 2, 3 } + +N = 5 +arr[5] = { 1, 2, 3, 4, 5 } +``` + +--- + + + +# Question + +Given N = 6, create an array of size N containing all elements in increasing order from 1 to N. + + + +# Choices +- [ ] 0 1 2 3 4 5 6 +- [x] 1 2 3 4 5 6 +- [ ] 6 5 4 3 2 1 + + +--- + + + +# Implement Function Code + + + +## Pseudocode +```java +static int[] num(int N){ + int arr = new int[N]; + for(int i = 0; i < N; i++){ + arr[i] = i + 1; + } + return arr; +} +``` + +--- + +## Increasing Order + +Numbers arranged from smallest to largest. +**Note:** If elements are equal then no issues + +## Scritly Increasing Order +Arrangement of numbers such that the next number is always greater than the previous number. + +--- + + +# Question + +Check whether the given numbers are in increasing order? +`3, 4, 4, 4, 4, 5, 5, 7, 9, 18, 18, 26` + +# Choices +- [x] yes +- [ ] no +- [ ] maybe + + +--- + + + +# Question + +Check whether the given numbers are in increasing order? +`-1, -2, -3, -4, -5` + +# Choices +- [ ] Yes +- [x] No +- [ ] Maybe + + +--- + + + +# Question + +Check whether the given numbers are in strictly increasing order? + +`3, 9, 16, 24, 29, 29, 34, 50` + +# Choices + +- [ ] Yes +- [x] No +- [ ] Maybe + +--- + + +### Checking Strictly Increasing Array + +Given an integer N, create an array of size N containing elements in increasing order from 1 to N. Check if the created array is strictly increasing (each element is greater than the previous element). + +#### Example +For N = 5, the array `arr` will be `{1, 2, 3, 4, 5}`, and it is strictly increasing. + +For N = 5, the array `arr` will be `{1, 2, 2, 4, 5}`, and it is not strictly increasing. + +--- + +# Question + +Check whether the given numbers are in strictly increasing order? + +`21, 39, 46, 97, 105` + + +# Choices +- [x] Yes +- [ ] No +- [ ] Maybe + +--- + + +## If Array Is Strictly Increasing Code + +**Note to instructor:** Explain logic of implementing this in code format here + + +### Pseudocode +```java +static boolean isStrictlyIncreasing(int N) { + int[] arr = new int[N]; + for (int i = 0; i < N; i++) { + arr[i] = i + 1; + } + + for (int i = 1; i < N; i++) { + if (arr[i] < arr[i - 1]) { + return false; // Array is not strictly increasing + } + } + + return true; // Array is strictly increasing +} +``` + +--- + + +## Right Shift of An Array +Given an array of size N, shift all the elements to the right by 1 and move the last element to the beginning of array + + +## Example 1 + +```plaintext +N = 10 +arr[10] = { 7, 4, 9, 11, 2, 24, -5, 17, 1, 8 } +Ans = +arr[10] = { 8, 7, 4, 9, 11, 2, 24, -5, 17, 1} +``` + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/051/237/original/upload_011e736ec97da2de5bb921eb120f38d3.png?1695917062) + + +--- + + + +# Question + +Right shift the given array + +arr[] = {10, 20, 30, 40, 50, 60} + + +# Choices +- [ ] 60, 50, 40, 30, 20, 10 +- [ ] 0, 10, 20, 30, 40, 50, 60 +- [x] 60, 10, 20, 30, 40, 50 + + +--- + + +## Right Shift of An Array Idea and Code + + +## Idea +1. Store last element of original array in a temp variable for future use (`temp = arr[n - 1]`) +2. Traverse from end to first index and do +`arr[i] = arr[i - 1]` +3. Till here all indexes are updated with their new value except 0th index. Finally do +`arr[0] = temp` + + +## Pseudocode +```java +static int[] rotateByone(int arr[]){ + int n = arr.length + int temp = arr[n - 1] + for(int i = n - 1; i >= 1; i--){ + arr[i] = arr[i - 1] + } + arr[0] = temp; + return ans; +} +``` +--- +## Drawbacks of Arrays + +Once array size is fixed, it cannot be changed. +If we want to change, we need to create a new array. + +int[] ar=new int[4]; +This can only store 4 elements, if we want to store 1 more element we cannot update the size. We have to create a new array only. + +--- + + +### Arraylist + +#### Definition + +ArrayList is a class that provides a resizable array implementation that is similar to an ordinary array, but with the added benefit of being able to resize dynamically as elements are added or removed. An ArrayList can store objects of any type, including primitives. + +#### Syntax + +The general syntax for creating an ArrayList in Java is as follows: +```java +ArrayList listName = new ArrayList(); +``` +where - +* **DataType** is the data type of the elements that will be stored in the list (e.g. Integer, String, Object). +* **listName** is the name given to the ArrayList object. + + +**Note:** There is no need to mention size in Arraylist, an empty Arraylist is created. + +#### Example +Here's an example that creates an ArrayList of integers and adds the values 10, 20, 30, and 50 to it: +```java +// Create an ArrayList of integers +ArrayList al = new ArrayList<>(); // size = 0 + +// Add integers to the list +al.add(10); // size = 1 +al.add(20); // size = 2 +al.add(30); // size = 3 +al.add(50); // size = 4 +``` +#### Some Methods in Arraylist +* **Adding an element at the end** - +We can add an element at the end of Arraylist using the add(value) method: +```java +al.add(10) +``` + +**Task:** Find out how to add a new value at a particluar index in an ArrayList. + +* **Total elements** - +We can get the size of the Arraylist using the size() method: +```java +int n = al.size(); // Returns the number of elements in the list +``` + +* **Access ith index element of an Arraylist** - +We can access ith index element of an Arraylist using the get(index) method: +```java +int element = al.get(2); // Returns the element at second index +``` + +--- + +# Question +```java +ArrayList al = new ArrayList<>(); +al.add(10); +al.add(20); +al.add(30); +al.add(40); +System.out.print(al.get(2)); +``` + +# Choices +- [ ] 10 +- [ ] 20 +- [x] 30 +- [ ] 40 +- [ ] Error + +--- + + + +### Explanation: +We first created an empty arraylist al. We then added 10, 20, 30 & 40 to it, the list becomes al = [10, 20, 30, 40]. The element at 2nd index is 30. Hence, answer is 30. + +--- + +# Question +```java +ArrayList al = new ArrayList<>(); +al.add(10); +al.add(20); +al.add(30); +al.add(40); +System.out.print(al.get(4)); +``` + +# Choices +- [ ] 40 +- [ ] 20 +- [x] Error +- [ ] 10 + +--- + + +### Explanation: +We first created an empty arraylist al. We then added 10, 20, 30 & 40 to it, the list becomes al = [10, 20, 30, 40]. The size of the array is 4 with indexes from 0 - 3. There is no index 4. Hence, the code gives an error. + +--- + + +## ArrayList +* **Update existing element** - +We can update the existing element of an Arraylist using the set(index, value) method: +```java +// myList = [10, 20, 30, 50] +myList.set(2, 40); // Updates the element at second index with value 40 +// updated myList = [10, 20, 40, 50] + +myList.set(6, 60); // Gives error because index 6 does not exist +``` + +* **Remove an element** - +We can remove an element from the Arraylist using the remove(index) method: +```java +// myList = [10, 20, 40, 50] +myList.remove(2); // Removes the element at 2nd index from array +// updated myList = [10, 40, 50] +``` + +* **Sort the arraylist** - +We can sort the Arraylist using the Collections.sort(arraylist_name) method: +```java +// myList = [10, 20, 40, 50] +myList.remove(2); // Removes the element at 2nd index from array +// updated myList = [10, 40, 50] +``` + +**Note:** Here is the [link](https://www.interviewbit.com/snippet/aadadab483cbc4a05b04/) to example code snippet for practice. + +--- + +# Question +What will be the output of the following code? + +```java +public static void main(String[] args) { + ArrayList ar = new ArrayList<>(); + ar.add(1); + ar.add(2); + ar.add(3); + + ar.set(1, 5); + ar.set(2, ar.get(0) + ar.get(1)); + + System.out.println(ar); +} + +``` + +# Choices +- [ ] [1, 5, 3] +- [x] [1, 7, 3] +- [ ] [1, 5, 6] +- [ ] [1, 6, 3] + +--- + + +# Question +Predict the output + +```java +public static void main(String[] args) { + ArrayList ar = new ArrayList<>(); + ar.add(-5); + ar.add(20); + ar.add(19); + ar.add(50) + + ar.remove(1); + + System.out.println(ar); +} +``` + +# Choices + +- [x] [-5, 19, 20] +- [ ] [20, 19, 50] +- [ ] [-5, 20, 50] +- [ ] [-5, 20, 19, 50] + +--- + +# Question +What will be the output? + +```java +public static void main(String[] args) { + ArrayList ar = new ArrayList<>(); + ar.add(5); + ar.add(2); + ar.add(9); + ar.add(1); + + Collections.sort(ar); + + System.out.println(ar); +} +``` + +# Choices +- [ ] [5, 2, 9, 1] +- [ ] [9, 5, 2, 1] +- [x] [1, 2, 5, 9] +- [ ] [2, 1, 5, 9] + +--- + + +#### Problem Statement +Write a function which takes arrayList as input and update all values by 1 + +#### Example 1 +```java +temp : [20, 15, 8, 25, 21] +ans : [21, 16, 9, 26, 22] +``` + +#### Pseudo Code: +```java +static ArrayList increaseByOne(ArrayList al){ + //iterate over the ArrayList + int n = al.size(); + + for(int i = 0; i < n; i++){ + //access ith index element : al.get(i) + int num = al.get(i); + al.set(i, num + 1); + + } + return al; + } +``` + + +--- + + +#### Problem Statement +Given an ArrayList of integers, return all the even numbers in the ArrayList. + +#### Example 1 +```java +Input = 10 13 7 14 16 19 22 9 11 +Output = 10 14 16 22 +``` +#### Example 2 +```java +Input = 4 9 1 10 22 21 45 +Output = 4 10 22 +``` + +#### Solution +Iterate on the arrayList and check if element is even. If yes add it to ans arrayList. + +#### Pseudocode +```java +public static ArrayList getEvenNumbers(ArrayList list) { + ArrayList evenNumbers = new ArrayList<>(); + + for (int i = 0; i < list.size(); i++) { + int num = list.get(i); + if (num % 2 == 0) { + evenNumbers.add(num); + } + } + + return evenNumbers; +} +``` + diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 1.md b/Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 1.md new file mode 100644 index 0000000..2ecf0c7 --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 1.md @@ -0,0 +1,663 @@ +# 2D Array-1 + + +--- + +## Agenda + + +1. Intro to 2D Arrays +2. Indexing and taking Input +3. Print matrix row by row and column by column +4. print matrix in wave form +5. Max of matrix. +6. Max of every row + +--- + + +### Introduction + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/051/238/original/upload_0da90fb446b2ffb5aa02c30693708136.png?1695918134) + +Two-dimensional arrays can be defined as arrays within an array. 2D arrays is a collection of 1d Arrays. + +#### Syntax: + +```java +datatype name[][] = new datatype[rows][cols] +``` + +>**Note:** When we create 2D matrix by int default all values are equal to 0. + + +--- + +# Question +What is N representing in the line given below? +int[][] mat = new int[N][M]; + +# Choices +- [ ] Number of Column +- [x] Number of Row +- [ ] Total Element + + +--- + + +# Question +What is M representing in the line given below? + +int[][] mat = new int[N][M]; + +# Choices +- [x] Number of Column +- [ ] Number of Row +- [ ] Total Element + +--- + + + +# Question +How to create a matrix with 2 rows and 5 columns? + + +# Choices + +- [x] int[][] mat = new int[2] [5]; +- [ ] int[] mat = new int[2] [5]; +- [ ] int[][] mat = new int[5] [2]; + + +--- + + + +# Question +How to create a matrix with 5 columns and 7 rows? + +# Choices +- [x] int mat[ ] [ ] = new int[7] [5]; +- [ ] int mat[ ] = new int[5] [7]; +- [ ] int mat[ ] [ ] = new int[5] [7]; + + +--- + + +# Question +How to create a matrix with size M * N having M = 5 and N = 7 + +# Choices +- [ ] int mat[ ] [ ] = new int[7] [5]; +- [ ] int mat[ ] = new int[5] [7]; +- [x] int mat[ ] [ ] = new int[5] [7]; + +--- + + +### Indexing and Properties: + +* We can access ith row and jth column of matrix `mat[][]` by: +mat[i][j] + + +![reference link](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/033/252/original/example.jpeg?1682880236) + +* If we iterate on a row, column changes and if we iterate on a column, row changes. For example, in above figure we can see that if we iterate on ith row, column number changes from `[0,M - 1]`. +* Similarly, in above figure we can see that if we iterate on jth row, row number changes from `[0,N - 1]`. +* In a matrix `mat[][]`, mat.length will be equal to total number of rows in a matrix and `mat[0].length` will be equal to total number of columns. + +**Number of rows =** array.length + +**Number of columns =** array[0].length + +![reference link](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/033/254/original/example.jpeg?1682880551) + +--- + + +# Question +What will be the index of top left cell in a given matrix, mat of size N * M? + +# Choices +- [ ] mat[0][M] +- [x] mat[0][0] +- [ ] mat[top][left] +- [ ] mat[N][0] + + +--- + + + +# Question + +What will be the index of top right cell in a given matrix, mat of size N * M? + +# Choices +- [x] mat[0][M-1] +- [ ] mat[N - 1][0] +- [ ] mat[N][0] +- [ ] mat[bottom][left] + + +--- + + + +# Question + What will be the index of bottom right cell in a given matrix, mat of size N * M? + +# Choices +- [ ] mat[N - 1][0] +- [x] mat[N - 1][M - 1] +- [ ] mat[N][M] +- [ ] mat[bottom][right] + + +--- + + +# Question + What will be the index of bottom left cell in a given matrix, mat of size N * M? + +# Choices +- [x] mat[N - 1][0] +- [ ] mat[N - 1][M - 1] +- [ ] mat[N][M] +- [ ] mat[bottom][right] + + + + +--- + + +### Taking input from user + + +Create a matrix having N rows and M columns fill the +matrix by taking input from the user + +**Input**: rows = 3, columns = 4 + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/051/239/original/upload_d4a27e7308a98fb1cc45a21dccceb859.png?1695918646) + +**Code:** +```java + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + // Enter the number of rows + int N = scanner.nextInt(); + + // Enter the number of columns + int M = scanner.nextInt(); + + int[][] matrix = new int[N][M]; + + for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + matrix[i][j] = scanner.nextInt(); + } + } + } +``` + +--- + + +# Question + +Print the 0th index row of the given matrix. + +```plaintext +1 2 3 4 +5 6 7 8 +9 10 11 12 +``` + +# Choices + +- [x] 1 2 3 4 +- [ ] 1 5 9 +- [ ] 1 2 3 4 5 6 7 8 9 10 11 12 + +--- + + +### Printing 0th Row + +Given a matrix, you are required to print its 0th row. + +#### Observation + +To print the 0th row of the matrix, we can directly access the elements in the 0th row and print them. + +#### Example + +**mat :** +| index | 0 | 1 | 2 | 3 | +| ----- | --- | --- | --- | --- | +| 0 | 1 | 2 | 3 | 4 | +| 1 | 5 | 6 | 7 | 8 | +| 2 | 9 | 10 | 11 | 12 | + +The 0th row of the matrix would be: **1 2 3 4** + +#### Pseudocode + +```java +void printZeroRow(int mat[][]) { + int n = mat.length; + + for (int c = 0; c < n; c++) // columns + { + System.out.print(mat[0][c] + " "); + } +} +``` + +--- + + +### Print Matrix Row by Row and Column by Column + +Given a matrix, print every row in new line. + + +#### Example + +**mat :** +| index | 0 | 1 | 2 | 3 | +|:-----:|:---:|:---:|:---:|:---:| +| 0 | 1 | 2 | 3 | 4 | +| 1 | 5 | 6 | 7 | 8 | +| 2 | 9 | 10 | 11 | 12 | + +**Output :** +```plaintext +1 2 3 4 +5 6 7 8 +9 10 11 12 +``` + +#### Code +```java +void printmat(int mat[][]){ + int n = mat.length; + int m = mat[0].length; + + for(int r = 0; r < n; r++)//rows + { + for(int c = 0; c < m; c++) //columns + { + System.out.print(mat[r][c] + " "); + } + System.out.println(); + } +} +``` + +--- + + +### Printing Row in wave form + +Given a matrix, print rows and column in wave form. +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/051/240/original/upload_fc79bae5e81f6eb0d3634e7a65bb87a3.png?1695918883) + + +#### Observation +First we will rum loop for rows from index 0 to n-1 where n is the number of rows. Inside this loop we will run another loop for columns from 0 to m-1, where m is total number of columns. Inside this loop we will print the value at row i and column j. + +#### Example 1 +**mat :** +| index | 0 | 1 | 2 | 3 | +|:-----:|:---:|:---:|:---:|:---:| +| 0 | 21 | 41 | 17 | 9 | +| 1 | 11 | 14 | 24 | 30 | +| 2 | 29 | 7 | 35 | 16 | +| 3 | 32 | 50 | 6 | 10 | +| 4 | 15 | 18 | 49 | 4 | + + +**Output :** +```plaintext +21 41 17 30 24 14 11 29 7 35 16 10 6 50 32 15 18 49 4 +``` + +#### Observation +* For even rows we will traverse columns from 0 to m - 1 index. +* For odd rows we will traverse columns from m - 1 to 0 index. + + +#### Pseudocode +```java +void printWaveArray(int mat[][]){ + int n = mat.length; + int m = mat[0].length; + + for(int r = 0; r < n; r++)//rows + { + if(r % 2 == 0){ + for(int c = 0; c < m; c++) //columns + { + System.out.print(mat[r][c] + " "); + } + } + else{ + for(int c = m - 1; c >= 0; c--) //columns + { + System.out.print(mat[r][c] + " "); + } + } + } +} +``` + +--- + + +# Question + Print the 0th index column of the given matrix. + +```plaintext +1 2 3 4 +5 6 7 8 +9 10 11 12 +``` + +# Choices +- [ ] 1 2 3 4 +- [x] 1 5 9 +- [ ] 1 2 3 4 5 6 7 8 9 10 11 12 + + +--- + + + +### Print 0th column + +Given a matrix, print 0th column. + +#### Example + +**mat :** +| index | 0 | 1 | 2 | 3 | +|:-----:|:---:|:---:|:---:|:---:| +| 0 | 1 | 2 | 3 | 4 | +| 1 | 5 | 6 | 7 | 8 | +| 2 | 9 | 10 | 11 | 12 | + +The 0th col of the matrix would be: **1 5 9** + +#### Observation +We will run a single loop for i for rows from index 0 to n-1, where n is total number of rows and will print `matrix[i][0]`. + +#### Pseudocode +```java +void printZeroCol(int mat[][]){ + int n = mat.length; + int m = mat[0].length; + + for(int r = 0; r < n; r++)//rows + { + System.out.print(mat[r][0] + " "); + } +} +``` + +--- + + +### Print every column +Given a matrix, print every column in new line. + +#### Exmaple 1 +```java +mat[4][3] = { + {21,16,17,14},rows + {7,8,10,1}, + {6,11,13,21} +} + +Ans = { + {21, 7, 6} + {16, 8, 11} + {17, 10, 13} + {14, 1, 21} +} +``` + +| 21 | 16 | 17 | 14 | +|:---:|:---:|:---:|:---:| +| 7 | 8 | 10 | 1 | +| 6 | 11 | 13 | 21 | + + +#### Observation +First we will rum loop for columns from index 0 to m - 1 where m is the number of columns. Inside this loop we will run another loop for rows from 0 to n - 1, where n is thw total number of columns. Inside this loop we will print the value at row i and column j. + +#### Pseudocode +```java +void printmat(int mat[][]){ + int n = mat.length; + int m = mat[0].length; + + for(int c = 0; c < m; c++)//rows + { + for(int r = 0; c < n; c++) //columns + { + System.out.print(mat[r][c] + " "); + } + System.out.println(); + } +} +``` + +--- + + +### Printing Column in Wave Form + +Given a matrix, you are required to print its elements in wave form by columns. + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/051/242/original/upload_8373f3d396acc9e8c1a50c98dd893f15.png?1695919265) + +#### Observation +To print the matrix in wave form by columns, we can iterate through the columns of the matrix. For even columns, we start from the top and move downward; for odd columns, we start from the bottom and move upward. This way, we print the elements in a zigzag pattern along the columns. + +#### Example +Consider the following matrix: + +**mat :** + +| index | 0 | 1 | 2 | 3 | +|:-----:|:---:|:---:|:---:|:---:| +| 0 | 21 | 16 | 17 | 14 | +| 1 | 7 | 8 | 10 | 1 | +| 2 | 6 | 11 | 13 | 21 | +| 3 | 32 | 50 | 6 | 10 | +| 4 | 15 | 18 | 49 | 4 | + + +The elements in wave form by columns would be: `21 7 6 32 15 18 50 11 8 16 17 10 13 6 49`. + + + +#### Pseudocode + +```java +void printWaveArrayByColumn(int mat[][]) { + int n = mat.length; + int m = mat[0].length; + + for (int c = 0; c < m; c++){ // columns + if (c % 2 == 0) { + for (int r = 0; r < n; r++){ // rows + print(mat[r][c] + " "); + } + } else { + for (int r = n - 1; r >= 0; r--){ // rows + print(mat[r][c] + " "); + } + } + } +} +``` + +--- + + +### Max of matrix +Given a 2D Array A[][], return max element from this matrix. + +### Example: + +**mat :** +| index | 0 | 1 | 2 | 3 | +|:-----:|:---:|:---:|:---:|:---:| +| 0 | 12 | 65 | 89 | 74 | +| 1 | 22 | 44 | 12 | 30 | +| 2 | 10 | 12 | 97 | 19 | + + +**Output:** +Max element of matrix is 97 + +### Idea: +1. Iterate on every element of row and column. +2. compare mat[i][j] with max element. +3. return max element. + +### Psuedo Code: +```java +public class Solution { + public int solve(int[][] A) { + int max = Integer.MIN_VALUE; + for(int i = 0; i < A.length; i++) { + for(int j = 0; j < A[0].length; j++) { + if(max < A[i][j]) { + max = A[i][j]; + } + } + } + return max; + } +} +``` + + + + +--- + + + +### Max of Every Row +Given a matrix and row number, return an array containing max of all elements in that row. + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/051/243/original/upload_72f24410dd46ecfdc448d4bb76ca56bf.png?1695919503) + +#### Example 1 + +**mat :** +| index | 0 | 1 | 2 | 3 | max | +|:-----:|:---:|:---:|:---:|:---:|:---:| +| 0 | 21 | 16 | 17 | 14 | 21 | +| 1 | 7 | 8 | 10 | 1 | 10 | +| 2 | 6 | 11 | 13 | 21 | 21 | +| 3 | 32 | 50 | 6 | 10 | 50 | +| 4 | 15 | 18 | 49 | 4 | 49 | + + +**ans :** +| index | 0 | 1 | 2 | 3 | 4 | +|:-----:|:---:|:---:|:---:|:---:|:---:| +| ans | 21 | 10 | 21 | 50 | 49 | + + + +--- + + + +# Question + What will be the max of every row for the given matrix? + +```plaintext +1 2 3 13 4 +5 6 17 8 9 +19 0 1 2 21 +``` + +# Choices +- [ ] 15 19 +- [ ] 4 9 21 +- [x] 13 17 21 + + + +--- + + + +# Question + +What should be the size of array to store max in every row for a matrix of size N * m + +# Choices +- [ ] N + M +- [x] N +- [ ] M +- [ ] N * M + +--- + +#### Observation + +Size of ans array = total no of Rows + +1. Create ans array +2. Iterate on every row and find max +3. Store the max of ith row at ans[i] + +Dry Run wrt Above Example: + + + +| i | Initial MAX | Iterate on ith row: j -> 0 to m-1 | Max in Row | ans[i] = max | +|:---:|:-----------:|:---------------------------------:|:----------:|:------------:| +| 0 | - INF | Iterate on 0th row: j -> 0 to m-1 | 21 | ans[0] = 21 | +| 1 | -INF | Iterate on 1st row: j -> 0 to m-1 | 10 | ans[1] = 10 | +| 2 | -INF | Iterate on 2nd row: j -> 0 to m-1 | 21 | ans[2] = 21 | +| 3 | -INF | Iterate on 3rd row: j -> 0 to m-1 | 50 | ans[3] = 50 | +| 4 | -INF | Iterate on 4th row: j -> 0 to m-1 | 49 | ans[4] = 49 | + + +#### Pseudocode +```java +int prinRowMax(int mat[][], int r){ + int n = mat.length; + int m = mat[0].length; + int[] ans = new int[n]; + + int sum = 0; + for(int i = 0; i < n; i++)//rows + { + int max = Integer.MIN_VALUE; + for(int j = 0; j < m; j++){ + if(mat[i][j] > max) + { + max = mat[i][j]; + } + } + ans[i] = max; + } +return ans; +} +``` diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 2.md b/Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 2.md new file mode 100644 index 0000000..1d6b6c7 --- /dev/null +++ b/Academy DSA Typed Notes/Beginner Language/Beginner 2D Array - 2.md @@ -0,0 +1,745 @@ +# 2D arrays 2 + +--- + + +# Agenda +- Revision +- Transpose +- Reverse every row in the given matrix +- Rotate by 90 +- Intro to 2D ArrayList +- Syntax +- Functions +- Return even elements from everyrow. + + +--- + + +# Question + + +How do you declare an int 2D array in Java? + + +# Choices +- [x] int[][] mat = new int[rows][cols] +- [ ] int[][] mat = new int[cols][rows] +- [ ] int[][] mat = new int[rows][rows] +- [ ] int[][] mat = new int[cols][cols] + +--- + + +# Question + +How do you get the no. of rows in a 2D matrix mat? + +# Choices +- [x] mat.length +- [ ] mat.length() +- [ ] mat.size +- [ ] mat.size() + + +--- + + + +# Question + +How do you get the number of columns in a 2D matrix for row index x? + + +# Choices +- [ ] mat[x].length() +- [x] mat[x].length +- [ ] mat[x].size +- [ ] mat[x].size() + + +--- + + +# Question + +```java +int[][] nums = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; +1 2 3 +4 5 6 +7 8 9 +System.out.println(nums[1][2]); +``` + +# Choices +- [ ] 4 +- [ ] 5 +- [x] 6 +- [ ] ArrayIndexOutOfBoundsException + +--- + + +### Transpose + +#### Given an rectangular matrix return the transpose of the matrix + +> Rectangular matrix is matrix having number of rows not equal to number of columns + +> Transpose of the matrix is new matrix in which the row of certain number in old matrix is converted to column of that particular number in new matrix like - +> >Row 1 of old matrix ---> column 1 of new matrix +> > Row 2 of old matrix ---> column 2 of new matrix +> > and so on... + +#### Example 1 + +`mat[3][5]` + +| 1 | 2 | 3 | 4 | 5 | +|:---:|:---:|:---:|:---:|:---:| +| 6 | 7 | 8 | 9 | 10 | +| 11 | 12 | 13 | 14 | 15 | + +#### Explaination and solution + +Intial matrix :- + +`mat[3][5]` + +| 1 | 2 | 3 | 4 | 5 | +|:---:|:---:|:---:|:---:|:---:| +| 6 | 7 | 8 | 9 | 10 | +| 11 | 12 | 13 | 14 | 15 | + + +Step 1 :- convert row 1 of intial to column 1 + +| 1 | +|:---:| +| 2 | +| 3 | +| 4 | +| 5 | + +Step 2:- convert row 2 of intial to column 2 +| 1 | 6 | +|:---:|:---:| +| 2 | 7 | +| 3 | 8 | +| 4 | 9 | +| 5 | 10 | + +Step 3 :- convert row 3 of intial to column 3 + +| 1 | 6 | 11 | +|:---:|:---:|:---:| +| 2 | 7 | 12 | +| 3 | 8 | 13 | +| 4 | 9 | 14 | +| 5 | 10 | 15 | + +Transpose of matrix is :- + +| 1 | 6 | 11 | +|:---:|:---:|:---:| +| 2 | 7 | 12 | +| 3 | 8 | 13 | +| 4 | 9 | 14 | +| 5 | 10 | 15 | + +#### Example 2 + +`mat[3][4]` + +| 1 | 2 | 3 | 4 | +|:---:|:---:|:---:|:---:| +| 6 | 7 | 8 | 9 | +| 11 | 12 | 13 | 14 | + +#### Explanation and solution +Transpose of matrix is :- + +| 1 | 6 | 11 | +|:---:|:---:|:---:| +| 2 | 7 | 12 | +| 3 | 8 | 13 | +| 4 | 9 | 14 | + +--- + + +# Question + +For a rectangular matrix, can we have the transpose in the same matrix? + +# Choices +- [ ] Yes +- [x] No we need new matrix +- [ ] Maybe + +--- + + +# Question + +If dimensions of a matrix A is ( N x M ), and it is declared as int mat[][] = new int[N][M]; +How will the transpose be declared? + +# Choices +- [ ] int transpose[] = new int[N][M]; +- [ ] int transpose[][] = new int[N][M]; +- [x] int transpose[][] = new int[M][N]; + +--- + + +# Question + + What will be the transpose of this matrix? +```java +10, 20, 30 +14, 15, 18 +``` + +# Choices +- [x] 10,14
20,15
30,18 +- [ ] 10,20
30,14
15,18 +- [ ] I am confused about what is transpose :( + +--- + + +#### Observations :- + +* if we observe example 1 + * Element at row 0 and column 1 in matrix mat becomes Element at column 0 and row 1 in transpose. + * similarly mat[2][3] ---> newMat[3][2] + * mat[1][4] ---> newMat[4][1] +* Is there any pattern between the position of element in intial matrix and tranpose matrix ? +* On observing we can say that :- + +
+ Transpose[i][j] = Mat[j][i] +
+ +
+ +**If dimensions of Mat are MxN then dimensions of transpose would be NxM** +
+ +#### Code +```java +static int[][] transposeMatrix(int[][] Mat) { + int m = Mat.length; + int n = Mat[0].length; + int[][] ans = new int[n][m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + ans[j][i] = Mat[i][j]; + } + } + return ans; +} +``` + +--- + + +### Reverse every row +Given a matrix reverse every row of matrix and return the same matrix + +#### Example 1 + +`mat[3][5]` + +| 3 | 2 | 6 | 1 | 9 | +|:---:|:---:|:---:|:---:|:---:| +| 14 | 18 | 2 | 4 | 10 | +| 5 | 6 | 3 | 9 | 8 | + +#### Explanation and solution + +Initial matrix :- + +`mat[3][5]` + +| 3 | 2 | 6 | 1 | 9 | +|:---:|:---:|:---:|:---:|:---:| +| 14 | 18 | 2 | 4 | 10 | +| 5 | 6 | 3 | 9 | 8 | + + +Step 1 :- Reverse row 1 of matrix + +| 9 | 1 | 6 | 2 | 3 | +|:---:|:---:|:---:|:---:|:---:| +| 14 | 18 | 2 | 4 | 10 | +| 5 | 6 | 3 | 9 | 8 | + + +Step 2 :- Reverse row 2 of matrix + +| 9 | 1 | 6 | 2 | 3 | +|:---:|:---:|:---:|:---:|:---:| +| 10 | 4 | 2 | 18 | 14 | +| 5 | 6 | 3 | 9 | 8 | + + + +Step 4 :- Reverse row 3 of matrix + + +| 9 | 1 | 6 | 2 | 3 | +|:---:|:---:|:---:|:---:|:---:| +| 10 | 4 | 2 | 18 | 14 | +| 8 | 9 | 3 | 6 | 5 | + + +#### Example 2 + +`mat[3][4]` + +| 1 | 2 | 3 | 4 | +|:---:|:---:|:---:|:---:| +| 6 | 7 | 8 | 9 | +| 11 | 12 | 13 | 14 | + +#### Explanation and solution + +| 4 | 3 | 2 | 1 | +|:---:|:---:|:---:|:---:| +| 9 | 8 | 7 | 6 | +| 14 | 13 | 12 | 11 | + +--- + + +# Question + + What will be result if we reverse each row of this matrix? + +```java +10, 20, 30 +14, 15, 18 +``` + +# Choices +- [ ] 10, 20, 30
14, 15, 18 + +- [ ] 20, 10, 30
14, 15, 18 + +- [ ] 10, 20, 30
18, 15, 14 + +- [x] 30, 20, 10
18, 15, 14 + +--- + + +#### Approach +* Our approach should be to traverse each row reverse it. +* But how to reverse a row ? +**Reversing a single row:-** +* First element of the row is swapped with the last element of the row. Similarly, the second element of the array is swapped with the second last element of the array and so on. +* ![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/032/143/original/ex12.png?1681962057) +* But if keep on swapping we would end up with intial configuartion again +* So **we swap till e>s** +This way at the end of traversal, we will have the entire row reversed. + +### Code + +```java + static int[][] reverseEachRow(int[][] Mat) { + int m = Mat[0].length; + int n = Mat.length; + + for (int i = 0; i < n; i++) { + int s = 0; + int e = m - 1; + + while (e > s) { + // Swap elements in the current row + int temp = Mat[i][s]; + Mat[i][s] = Mat[i][e]; + Mat[i][e] = temp; + + e--; + s++; + } + } + + return Mat; +} +``` + +--- + + +### Rotate by 90 + +Given a matrix rotate it by 90o in clockwise direction ? +#### Testcase + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/032/144/original/dvfm.png?1681962700) + +#### Solution +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/032/145/original/dvfm1.png?1681962816) + + +#### Example + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/032/146/original/tescl.png?1681962988) + +#### Approach +* **First we take transpose of matrix. On taking transpose:-** +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/032/147/original/rtt.png?1681963164) + +* **Reverse each row of transpose to get the solution**. +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/032/148/original/kldklf.png?1681963261) + + + + +**Code** +```java +import java.util.*; + +public class Main { + static int[][] transposeMatrix(int Mat[][]) { + int m = Mat.length; + int n = Mat[0].length; + int transposeMat[][] = new int[n][m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + transposeMat[j][i] = Mat[i][j]; + } + } + return transposeMat; + } + + static int[][] reverseEachRow(int Mat[][]) { + int m = Mat[0].length; + int n = Mat.length; + + for (int i = 0; i < n; i++) { + int s = 0; + int e = m - 1; + + while (e > s) { + int temp = Mat[i][s]; + Mat[i][s] = Mat[i][e]; + Mat[i][e] = temp; + + e--; + s++; + } + } + + return Mat; + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int Mat[][] = new int[3][4]; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 4; j++) { + Mat[i][j] = sc.nextInt(); + } + } + int transpose[][] = transposeMatrix(Mat); + int matRotatedClockwise90Degree[][] = reverseEachRow(transpose); + } +} + +``` + + +--- + + +### Syntax +```java +ArrayList l = new ArrayList<>(); +``` +Here each element in l is an integer. + + +### Properties + +#### 1. add(element) +It is used to insert elements in ArrayList. +```java +l.add(20); +l.add(30); +l.add(40); +l.add(35); +``` + ArrayList :- + +| 20 | 30 | 40 | 35 | +|:---:|:---:|:---:|:---:| + +#### 2. set(element) +It is used to update values at particular index in ArrayList. +```java +l.set(1, 80); +l.set(0, 90); +``` + ArrayList :- + +| 90 | 80 | 40 | 35 | +|:---:|:---:|:---:|:---:| + +#### 3. get(index) +It is used to get values at particular index in ArrayList. +```java +print(l.get(2)); +print(l.get(3)); +``` + +Output : +```plaintext +40 +50 +``` +#### 4. remove(index) +It is used to remove value at particular index in ArrayList. +```plaintext +l.remove(2); +``` + + ArrayList :- + +| 90 | 80 | 35 | +|:---:|:---:|:---:| + +**Note:** +```java +ArrayList l = new ArrayList<>(); +``` +Each element in this ArrayList is of **Integer** type. + +--- + + +### 2D ArrayList + +ArrayList of ArrayLists + +### Syntax for 2D ArrayList + +```java +ArrayList> a = new ArrayList<>(); +``` +Each element in this 2D ArrayList is of **ArrayList< Datatype>** + +### How to add elememts in 2D ArrayList + +```java +ArrayList> arr = new ArrayList<>(); +``` + +Here each Arraylist in arr is of type **ArrayList**. + +#### Pseudocode + +```java +ArrayList> arr = new ArrayList<>(); +ArrayList d1 = new ArrayList<>(); +d1.add(10); +d1.add(20); +d1.add(30); +d1.add(40); + +ArrayList d2 = new ArrayList<>(); +d2.add(-1); +d2.add(4); +d2.add(8); + +ArrayList d3 = new ArrayList<>(); +d1.add(50); +d1.add(60); +d1.add(70); +d1.add(80); +``` + +Output: + + +```plaintext + { + {10,20,30,40}, +arr : {-1,4,8}, + {50,60,70,80} + } +``` + +### How to get elememts in 2D ArrayList + +>Note: arr.get(i) = element at ith index. + +#### Pseudocode +```java +System.out.println(arr.get(1)); +System.out.println(arr.get(2)); +``` + +Output: + +```plaintext +{-1,4,8} +{50,60,70,80} +``` + +### How to access element from ith ArrayList at jth index + +>Note: arr.get(i).get(j) = element at ith ArrayList and jth index. + +#### Pseudocode +```java +System.out.println(arr.get(0).get(0)); +System.out.println(arr.get(1).get(2)); +System.out.println(arr.get(2).get(1)); +``` +Output: + +```plaintext +10 +8 +60 +``` +### How to return no. of elements in ArrayList + +#### Pseudocode +```java +System.out.println(arr.size()); +System.out.println(arr.get(0).size()); +System.out.println(arr.get(1).size()); +``` +Output: + +```plaintext +3 +4 +3 +``` + +### How to modify elements in ArrayList + +#### Pseudocode +```java +System.out.println(arr.get(0).set(0,14)); +System.out.println(arr.get(1).set(2,-9)); +System.out.println(arr.get(2).set(0,20)); +``` +Output: + +```plaintext + { + {14,20,30,40}, +arr : {-1,4,-9}, + {20,60,70,80} + } +``` + +--- + +### Problem 1 + +Print 2D ArrayList. + + +#### Pseudocode +```java +void print(ArrayList< ArrayList< Integer>> arr) { + + int n = arr.size(); // Get the number of rows in the ArrayList + + // Iterate through each row + for (int i = 0; i < n; i++) { + // Get the number of columns in the current row + int m = arr.get(i).size(); + + // Iterate through each element in the current row + for (int j = 0; j < m; j++) { + + System.out.print(arr.get(i).get(j) + " "); + } + System.out.println(); + } +} +``` + +#### Dry run + +![](https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/049/618/original/upload_4c380c72302ab5955366f07e171e5d34.png?1695231151) + +--- + + +### Even numbers +Given a 2D ArrayList, return a 2D ArrayList which contains even number from every row. + + +#### Example 1 +```java +arr = { + {3,10,2}, + {2,7,6,9,4}, + {18,20,11,6} +} + +Ans = { + {10, 2} + {2,6,4} + {18,20,6} +} +``` + +#### Example 2 +```java +arr = { + {3,6,2,9}, + {2,4,8,10}, + {3,9,7,15}, + 8,3,2,14,19}, +} + +Ans = { + {6,2} + {2,4,8,10} + {} + {8,2,14} +} +``` + +#### Observation + +We will traverse every element in ArrayList and insert even numbers in output. + +#### Pseudocode +```java +ArrayList> even(ArrayList<>> arr){ + + ArrayList> ans = new ArrayList<>(); + int n = arr.size(); + for(int i = 0; i < n; i++) { + ArrayList l = new ArrayList<>(); + int m = arr[i].get(i).size(); + for(int j = 0; j < m; j++){ + if( arr.get(i).get(j) % 2 == 0){ + l.add(arr.get(i).get(j)); + } + } + ans.add(l); + } + return ans; +} +``` + + + + +--- + + \ No newline at end of file diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner Functions - 1.pdf b/Academy DSA Typed Notes/Beginner Language/Beginner Functions - 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..faf317ed4d5dcb10a864965715064051140fc23a GIT binary patch literal 293729 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�!lt_u`JM7s1&RGNr@NUsrTG2uKkFp$JItMY__Z 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 aI#Ze8WQt2{;-Os1K7t4C*&eA!<$$ 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�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≷DwHE!(T_MXei)6`{18wLbO%nLU~XEX72B^ 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 D1oK2N literal 0 HcmV?d00001 diff --git a/Academy DSA Typed Notes/Beginner Language/Beginner Functions - 2.pdf b/Academy DSA Typed Notes/Beginner Language/Beginner Functions - 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cb6a75613d4cbade998b90694de51dd60898e3fe GIT binary patch literal 969059 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%0A7T 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

0o|>Hy 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/HEQdpL_l!DIB1tffQF>y26PPD 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

(b54Pc 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%0DtvOLqxq!5Zs1G%ZPA#SWs&cm&QZ5l>z#LJ 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 z zSuD2V^dMMv+kZ-9WRTgg24Q@_7rR&@2oQzRALwAXyvU4)x{JGxgE#3B9jjettoqO zcw_3CTZ<>NSa>W-Unii|RKdfe@P)LQX5Kk(ch{D_WMiejH&|mz?J$+owZE4|RFs(u zBaSuiIU=gzHCI|(epA*pOgi0eNRzQ}wpGz6&!S?%PTm&m@A02MzuK?87+L+fw@mDI zV7vyzsz%&8FmsKk<}iWC>PmWM{I7iU-!^n!Uw#$fZp#I3{xd*g&4NMfY%^TYH@TzF zK7M|IPjIj!+?{h5v0{ z%mAMz&zL5O+tOLxo$ET=So8e&T2@n4q3HVg;LF;EqYNFfL6qpemGQ%5>e2>WZg{pMZEJllbM*}%Ivm1C2O17 zA)hv7AV6RTOMzv!X-=c)eT{>B#)v3cQPcg!;0AF<(!wI!n4(?5mdsaYgS~axA;+e% zTT6?)ExxF|4Z_Qjm7SO+T6D&sk42Fngk;=`*@_ZKXLB!II_2-)DW z^77r~X#5-%)DSFO&ka_H@{Y6h(vs(w|2@ex;~QPxV;I!-^btutIkRX!{lU#PnJT zOx+q6s28!J%pN+7Z;L%aDW@4nblDmTt!0Gx^ZqRUIGGz1ijDc?X*b;%FzEdwpIhVL z=zTG4U1dF!thKNVmQUa(8eylxRt>&7aG;`2(k4DKo=(p>nVd-<>vp@6_v1L*FtduX zM-C(YJne2bZ|9z&*dF}2k9YF>B2S1t{w|;8hnLltI7_O`zEkB9r&!fl^^yg zsr8ldyY}C$jJS=CJ%(jOjM(vzojERleUSR@(Vpp|ko>_=Kp57$rxwiw2bo*Vb-%A& zSF9muIiFJoSZNuqs7t(9I`Z!7wF8eHekQBi$v9fv?vzA+A}?*w5NU z?3*o}eR~?KezawY-0jAlbv2^8_Ke%IMX&3WY=t0ZU(3f~=1-+l2e0Jg9$TQqWAWi+lbZ{u-AhFe*&Tmai{2S3k8L%O7A&K<`M~Qe0CJv4XBbVKhJkb z)l9z~M8ul5VN3j4KE-A_Qd#>Wv=285uaRE$o95>>8l~*`|w0Wv7XR9SL9WYW4b)x42QW zseHQ$J6uCIR6Ur_{>H9oD8OJD!Ym%sEPrKo?Y9cURIAo|z9MT1+t%=lk8hKj={J}6 zZoGDfE+6`pY4(`&^s>Cp+4?r%pB-Nq(rc#W#_s1Fz&{ea$x9mzy*C>m*!zy|(oOb1 zL3_^?Gpv-l`N^1HsFDE$70wJq!XiMK*+><)O!XPMb{t>p=M7HGH)`(_IAo^n1u%z; zOQZl#2Ey4h1Xmj;NvVbwfl-+CHL>{(PAvEYDYDi$Wx4mX+MOhUuPelBcN%BJO&BMd z1B_eG_Uoy0?4+^1yCo}Vyvx$8hZ(+Vbq-oGLbqv9QyAfVQ<9N-3Bf(W4V^|Tmn|{h zBgzuw1tOg8ac~=SV=A^PSXMf!=%!EDQ7(X>27@V)0e^c1K;_Qlz4$Dm`oPJu!TP~c zJaj3=#Od;z^cHa6(YLnmz^7s^lhnulU-f@Lg>a)vTz|ihJ+F zxZ4SX+r80PgC@IzWQmBlmA=1ZPg{6r75Z=&*-1Fr_Oo-!{MX)M@x?Sxq+CAHm)?hd zzwUMxC$uxb6#vUmzj$|jIJ?AJ;Oc-H95zF014^D~s%Pyw8KP&W(sQKB)=d^nqu_(3 z?vIg=GM4ZGK)7@y-4quP--OfdQND#cnG6kHeFzPmajK-i*zZ8x)fmk~$+Gk49ey)T zzGT?2sv5>6$HeBNooQJwg?LvCo8q%EPrnBbFZQeoiY1ELM+Js_@78Knh@w>P_k%~7 zXKMuq=+->UX#)y-`%>qc6s${kU)9Bbon@GDjUZkEPRDB#w|>n*$me&r%&Sy`&V~c7 zJhc%hVbc8YR();2IFW*7>n2bDy-U3(jlOOQ zJvZ$BP+RBj8~MmGdoqY1aTkzppaP2T?k?34E;Z$In%_zcQ2E^;@m;?}`gdPw=G!5j z*gpUVbewq5iTv%f#e*Mq{G7Iw$~A{nk#HqVtomvG6bhzx9t-Dgt%X!JSdQkB_W^Ms z2MkR5?W(y4_g>@kh^l+gAw>_u4Lqp#GaV_5Wo+X%zfL<8DWZK%UcOuF!KQzG<_hNP z7q1Mk5>b}`cOVIVm$9P8PF0j|d#t|*HMcgHMmn|-ZV~yWV2tHER`+niO08w(@?O

vv%4pPx@PE8G>EW(-v}p@pD?GNXjaqDN{x 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

H^B=$L@7pEg(l{a@A-(`Fo(i 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

jwue^z#dV-0 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

-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 eTMTT6l%EDk@(5z4kDL1f*q!z5|)cz2s7MZ{6DI zP05rCEaAh0cEaJupGGf~%^u1zXfC@Ic}DEpK2s=a1R;jDfLS=l4x&$HH@i$ z=jKiIP7}3;h~l*Uo$(aEl|*=n2zF7OXKD9_j^D&-YH?tlg4L>l2JG~9Hx;eq`K3jw zw$j+e1^)ey36u9ji7SmQ`eH-c$Z(ce-<-D3&&1s2gIIoM z1m?rePvy+BPhZ$89!74$I)DDDqm zDZp`Q-?Sj6@pAX1Lx{U1e9{D-Z`hjNH+gfjjGpiFkS+3MhlXbA^ZV|nw>#g_tEXk@ zxvI^zo*4C|;rWzs?gz2Y1_$e`72VU3rZ!{V8gq%bUSA4*pG<${U2NA?lfa|z0h=OB zcGYoqoCI#!hjgV!*bx7wx)f z!DN%GulMxu!;?&v3MQSQzWBUxo7pO1Z|4JCJPCGS_PzZhzvma0*3fbXW&!oTEJ%MZ zFfgkQ5n^6u~2hDcDy%hL1rf=|`y_li&7{t;%SA|!H?Nbruey{(-m ztN0BuBEehso*wtD-4$J&TwRUh>?*|JT2N&-WAc=?=Bq+NK$j8CK2E^jw;)2uxARdBy1&`vYu)-xu zEerf>Zd5md<1-1^Zk04qYY!mVMJ(Mz2#IKD>F60au5)s6^N5Ox-;|J)QoOCCta3+H zO-EPnfj-ztuzF-|V{2#c;Nj`@#M{T$FZ5Yhc*OG;k*{9ANqC!>^e#CoJ0~|U|9!!S zFJDW`$}1|Xs+(I{+uA$6b#@I74gVM!9UGsRUs(LPw7jyqw!XW!e{gtoj5;~RvWW-6v|s zOW=$pU>}?rCXb}3ok9EiVqRFV--{v5$@?>%hz?I-a-OLuIykIK!n-P zlKRV|x{J_~CB91|{$dP0Pr_l-dD}rudvGEEs7RlbH9;SA3 z!nCK-QxkpH+O4XBB=|lwh7fFZ6#6%S^WF=BW8~}kDaK3Lmaefk&(mK@blxy7e zvh&9E9YME7&V1^qUCyH)C@*AUGsE?YLR4heM0cwe--xuvaT?ttA)M5wqfy`(#eP0= zP?+CyOfAHuF>+xv>!VV%M=*ym}>KXY=qL&!GnsQo>8FgPGJ>=vEDpz)S-2 z7){}*0&pB$c43Pu!KEiT_i$R$uVS~4mH(_Dp-V7VFgJ4qP?WM6{1gK?Kk5XWgN%ZJ;RlloQ(7s!=Dt2Wu3%H=I1;T)G`0S zJ*oKf87ujmd2e*ww&04!-it#3leA1s9Dm-125_zm7oHDK8H55z1#D=V~e;zVC$oM*_%k{ ziA_U-L_2^5cpf?vYl9u|3c4-0r1rUk=1JDRM$>_4Que!`D(KW-vVOZ86Zl;-+gTKV z69aYp2Ze8dYpP}$d#;vi3$Hg{{(`vK4{LpIR0@~)T1K1v1d|Ooc(S3P#pE5pG;ECv zxVQ@Y-MU9`H@K7<@C{|*4y$ZP!@bQc z@VARs?zqCkz@GiSupvGg&kolLFh+^WL+H!@tRlAgC#Lipn1Zj1sQ=;Etq?iD)W?{% zy+-&+9_It2)`u8A188h5)S$)UZM4S^5;5$^PWnF&A$=pU zgvlkOS;*8V^1J8ZJaV1n$FzI-bAP24=g)oi-`GI%OpNe;Z?ql13Yf0@NANWN@+9f6 z;J%!cCqFI22=tp#s2J0C+&xwR!0vdW9gt2r017AQWag&wZw4|&Ueb2niY`!!wngdu zsZ^y<&eHdO-)EKcVf6bmT==wR7ox9D;%bMEiqMG`?HJp|dZ2DV2y8olNqb8!FD8F@ z;5*a%u+0UH_o-((fqk@q`hrK%sor@f%D|l)mK8ny7$O1sFz&42ME3=w6BX4%X-tl| z%`3p37seyk1U&{-|2!M$t7B^F3jb5I%Aa~J0#;XMKq-oUQf2?m1D8AS*ijL3&qVw# zRttl|REKF_r?Ci5vH^DnnyVQ`+; z`2GFw4F;Dj@87l@ zw$IGF60oLca(+RAlAY!K8PELDWQj+a=P6zdB;z?H<}WKA2u8Su+4zzT?xPBP6UlTj8={h zwpo}T*q4moVydq^y5KcfTqgRw!@0aQ%+^ej!y`HFh-nw->;c!}w1GlCnue93YK~6A zE}z<3eBn;1*BNd6UIp;3P6L?6IQ;Rjo}Fe*dSlas?ogZ7Hq_#4GuhqlqqitZpdj#C zb411kS=>6fF6AHE{ce+kl=F-~_}l5o*X)?c(lyg3$`19+>Z(woiyl}hthGnF1x_Qw zpX)4i<5>BpCtp0xe zbO`>TIvDvRe(I3=Fc28Y;YpyB=06hO;qw>yG_GPz(MHjh^;wuF2s<>kk!S=c7sj>N zfibxCYwJ?=;@J&NWR_N&ZfL}pvTlP&ZnTOZDB@gN(Y zxU$0ifJ;w@8ti7rqB_!PQ7cb()#tpQcZB(?7PQ7Yl;6~HDR1BsFX(vR=DZF^0xhsG zsh^+K12Q&7Z%i=v%S_yj?nmf#AsxJdx@QeqB3=WaXHkn-1&NOP!j5~~hZ>imBvy|c z4^!o~^*KQrw~Oy)Jm=}6#nc<=GIjS<+Ra3V z4AW~j)EAhqT@Rnwz`eodMZGus0-Q|Ban|m}6e6C<5%^TJ8a@7Wr3jrL=PJ8f-k=yr z=W_{8gR)ioQ9OsxbeyzXd8&`&Nzz5AxJ}qGf7_kOf5kVmTPTxmwb!x5wY=&n!R4N% z#FH21eutBqlnNGhFLQ3uy0gOI%9!)I~`WNRj+~P_^ii$ zGXxrjmDvk#Hb4NPL6!kfuO%E%eZFscMILq@uMCV$@8e_0`5O$#dGVX};~q~lgLZgE z_Cqi{ap9x^=9Ityb1=SYC~{@_w_!WUtIrRX|cdsL5EW?yEId0$Xu#yaJrY2r|7Z@emiUQfMa)9<=8VJ!^A_r;}0yL6+D0Rw< zfFjUZ*gT)+$N z0%hE1pWuCI9ZR66tS~X=CJptD znR~w=y?Bz8K$Y_oPj;oj3Vfa)y1(QBWMU9X%Ox{m5{Dx7OoIL-5`ulBe&}J_whmt! zT>0JE@jxED&4E1pjixdna{(O*LiIr?6q!JNvR93%BnKF6vuXuj$mc%77nx(G2jxq|LT)%*~i_C#ro|6z}2pUhh(YHk=+K=d!@z>#%?A;r4&@WRS z7d_G!6rgwIDxiQ~1Dt$lPv-`abP%-Y(S~uqfY^Q;m!9!DT{kW zuOA+x!x-@!esWbhjxB=)8W(hbE|sWXhn zV%LwmV;mz}Yt7_$FR-(?h@bSGWu>*4bzmOJNbscgo$srq3&zBWk78OhV+3Z^JMnj{ z%)0Q=xZ0q;6>?y{Z!`s%_%C|m9x^xV4yb>AdT}c%ye<~>)gO*vMkDf*!~cJp1jI4} z-dFfrEO9OZK;zcL$>HC${-MIvC-dn9hRjYGZ6G>}6F|0#lDNP#axWgs<>K>4RRe)u zApaS#B}`PNzjjT;sTgRzDfBI@D^gFP625ya?WJiF6!|(I45{Er1ufP9;~GYWM^%8- zW#gcOm0lM0g6G;3@ZAw{whV-?AKr}_q*?G!u%pTM@MsjCcr+m2a$-hh(1pJT#uI&| ze`PmKo!`~IiLUt_`(KJTOvxLp!XrF%&n~u zP<}75oy813ARvJm1-Y5BkP2Yl7WrZ5>rL+UH8PfgHJ!@K}~ZYk;) z$&!b=-x$%xMHdtsqa=fP9z#S6Xcl7^!?P@|O`140PO|Fzw=)%kXZ{cg7Nb1^_Co zI3Rvs;C*1|OkndFAOtuWK#a>>!8`RK{3RC-?FA*6U|>W$4t00vcXvKHqRkdti>njzaVLRwt{OWLV_4 zKuHUJLE_;`z+RiHp*b~>0p&)(n_)Np3sTGlkXRiepFFf(yPzC8=$Ix=$YDRYa{B}R z9Iw28HUt6?z-_PwBLSXt>E3HW#kgVq8A?FpEk}%Co8)mN1LdIGu?}U z8CDb=DbS};_63;}!mp@bhxMj`^~2(ne%YHx2_@Saq{>42ubn&Teti5E7;*1vFiEf? zp0?rB(T;{I4Rgga^eC;}I89{YbARTA9)Wwt_b+-&>yl?__T}cV@GB*Y<>u-8Lz}YDdXc?)u029WQwOxgUhLAmW`{jlg3ydY9$8Aq#WE19jtnx!z zi=O7&Uq7(F373x7&Z+W^KfRehlb2~hHAiK5U!w1!vV+czB9YXJYbBy5oKa0rb{wcz z)P=qk_LujPf&`?2BwLoe~KOGyPsIFR=EsNM%1m57d2TRA%z8^cX6+f8}JK9+D*S)~m zTP~Ml4;%%4ZB&uG7c?}5g_9E~!>zXO`p$vM+9KwuP^70|bJB(I|Haprz(e)+Z;xyx zOR{Dygh*2MFiQ3iVq_blER%hWVW{j|2!-tXHrZtxyCnNQvW_)mrWnI4zxVV!&-;J( z_w(swmb2Vv&N=t}y|3@}y{;YT#Rf=7ls*qPK1cfqA%#-hQ_(hHYa7IH8L zg(le0lj#f4Q-9;++?VFpb31eEP7YMppy=&2)r@$!FoKDa8fug#@@ku&e{bS^cYi3* z&vdhn#gG8{Jk8rCpub{9kN)Xvs{3JOQ9PX`bk8EpA_r6h7^eZYH4w^RkUb6=2RFse zJ)JmkyllHOJ2l`Gd+p@)pOad3!D`xo%jd_Mt6wo49%QX8Dd5xN*6f?6tt^8P4N(@l zQ643~(ztpA6VH$bM#Ss$gvFk7y!;UBsr25zOw5A>xU?g32QipcG72;d+-n&}h+ z=PgpJVJ!}$SJ(k{#q=)` zyX5$HUWrk$XGZv1a#=eQQHC&ZXo5pUzm( z71ru%fDIRjggBJ^_}ZeNbEVV%;IZx*3XAGf5V(QWj5t2>(hTt8zEcn~?Y`a$qN9^c zA*i*rUvy=6r1J#dwQ-FX7kJ&EL)&%4ZWjdTqjUlNT0F~rO?C@v>d9E(J>Y4;3F<1O z9{<G(Ddn z9cGvL|D3{wexT{>4ttvHHDUj5UkO!GHTM}n2nYU40_g4km$$&V#O{Y~<0{_%cHNv~ zby_Y@{*(H6*oscE=oalg@U0tJEREOV+D$E92P(0*F^NAG2Ql7ODlVxD^BFae@Xe$B z@7gZ^^WTeYu_{SHW{R>0nB_3mcT@(zQMB9|B;93ie?2MEygE)@#wYJw5O&Vn8Tdy0 ze_JF*npZe1tE{lSd+K-k*^Ld{UjRRw^M}KH(>~6D6YVcCJ|7*#Wq!#()4^Dyq=Z(M zeHo%X+!CAA*S6=uWV45kv$a@;=89gy-0Xvo%%aS7mIgVt0EsyVMC3}tJ5!AG1sCOw zWb)99x38jAsr`_JU;o6b@ua=HB_Y*Q0BQQU^vKoJ+odJ~`8pSfD8f zbGZgRKUCirJbZL?8pSu)zk;=GyC9n&yoQJoxRRK*hPu@26(VuXp5c%$lW4UH*+;E< zER^bG4tLuMd>(iEb^eZ2tKAp=JHd1M7-Uqdbl(_@QPCdyc}{hyb7Os@;WB zBc3gcBhSkEzh$=8FONKpEtbbPbRT;x@~RW^iIRjYbAkk00#e@x&f*RopHfkA-1T8WACbKa(b+HJr%%!a}o`c06f z6Eql@!-{SCSa2)9#rl;DW@PL!ECG<@cr%cLX6qjA~^nRRqa2^ymiIfes<#HpsTa}9wbBU6H_-)2kcFUqk`Va14C#Aid z#vaNPv>vs;SGb!aMu@=Huandma1z6Edy5M{i{XpOLr_VTjl>Vg>6NHl5a}8=P8~I+ zqO?W^Yfl{u!HL0vO@-S?j?Ly=>?4-&0E$S4S?bzWw1;Twi1($47o$Fj*_jpAE>W+F z;XT$9X8fmSnXrabQt!O3rZ7+?{MrHT4wPXc=amjVC5=C7P4E6J$?GiXRsr*`6=P9-c-A&?7iTN zRw3fr8*vunH|=E-T8{by8-S(>hR+Gy40+zkzvFE?B$l~YczV%EX>qFBYg5HEvS0 z(6!-}D0#29leYnzljK&qi+{JUfEG^_FL+!LH}8N(O1@X3r|VR>)33o6`^nX7)5NWK z{>VimT^@V~vD&`&EA%D_04beFA~#wbkl!2k5Dj1wTgDo)=kOd{gHT<#drq2bFNZJL z{Y4kLOJjh(I>ZVmyb6BXDebE4w-SA%uWF0Y%@}QPnF;{V!ewaCj>`SDEEe`1AD4{T zi6sl`hxRG-SG24hxX&OL@(JPCmG#2}wTp=Ei!ZmZZ%-^8mSFYWh*xwPz0^vK_YeAC zp$<^kLA*5Am{8Ah`VoNs>%4@K85y7|{ zv)1-$`9+RB9oN!aQqXS%3t%+{6m|ekDL+pF(sP+qRIaxxy_3E7K7?vloexU7tTBN0 z=#?gjvV_YaF1ebc)jq;Xv`)Abyw6YG4sy%{e6heyMm>Oj$SwY;m~|W~Dyw&|n438t z-~U@>RB;qgx9rR(st^=R2^Me;uQjq7^x|Jg-iaH>JTYzuNk#OQpqvu=QEO&_cC|`U z_)x?rS$bgZj)i&%?4Y<&&po1A6T{0bVV2euv9PMyn(GMzN83VGi0+qC?MVcY#J8VI zbzg$6I<(F$zN35vGbe=seGMa`N2=r#z3vBV%LVQ~e1_m?7R#MZAt1Gh>`$UDjU;Il zTDoS6JgRC+6?L%bP{dbSh7VKvOk=>$p;YcH9llnN`=iKrIexZjoRgW#fq{YBrXHIf z=TYi{jSH51$g06Wo`3HN!gGYmZ${OYr(7@Gf}-2-Pq9u1X6tPS!UI7}iEYkJQk%u! z?fcx4+V76f_2gnT;z|it7?wl?qf||a8%vLJn`j0jGSxkPW6THnQ@bRi!`f41>xkQ@aJ0yrwT|1A~94pg!H*HS~J$!=zGE>^q< zcmYV9{l6D#jjehSTvHlLG@Gv5gBiaYkf6mYp!dj=rsIAW0;)F^a=oA$Ll&Iy@=R<;1B&?rAIE{wQf6Mf=*6OLJMpo> zps~SnNEz^t>-MikQ`6Z4*}(B128{Pc=|8Lm2o6*oo(4mD_RO|jy?y4IjHo<>I-km9t}{MgFjGY&7XyR)Y!#=`%Ziw1a}aO7=#yuv-(PJ&UI!xZxrAfl zBhpJ;WCr%6-FvcK?StQ!FUQiHyb(@??mt3v*b@~Z4Wd!8zKtB8yAA*n=pbXB| z0vMtUfJ9A@<0_l!O}_#_PMEx+8Y=A;c$rkm(I908$lN1vXb=1?0Asi>46Hg%x3Ya| zdSL_DOKoCYg%jlglyGouQVu{VzG?#lXC6}(;C*{)oO^y)!@S>If zwTEv_%D+hEE4iB%x$|cg|A4;h{5^-W!)PK`kh^IZ#9$ z0Qqr`UhEIc#rG{AzHc1&gGPX8J@dzRzeC=Tkc#8*mrD_KeK24Qby?BN~9HXkfw9?gr%8pj(O zB+gAc@MS(SY3a^aJ9hkDT^)uLw7f46a>Mb{HN|IuvVaK0YvjZ#V6riu7oua(eNSFI zNi{+dR2b`$?0LTXz<^6tD|EX-`cF8kU(scTXL8tGp`-=leFzKmgJW-l6k>(KtDnsj{JAWu z^jsjaP2g$tS@Z0{FWb34EHK{r!*fo}FQ@z^o!(?_Q*IKPhyX6dd~9H~R42<5CowCIKUpJ9(>WUGgn zjv>UiKP%DO3u~Zb*{WQPc3qo3{)d*fig8g0${qg!KQ(mO@ICYHM|zA7i$WE zMX|iCw8~0`OYFObj6J(Q>M|YQXyh#S5pd1rgIsnE~S!R^^v;pnV6b>`7Wop>k3q1{JTjs9Jp zM#Xw>Gdp5jw>-lB&IHdxBdd?rmtDeATTX_mGq=^mNLo{!90Xp|xyDyKs$kvl8h37= zMs~-{Q35M&rFW$P+}mcv78ta%65%Cos_!Zld!4ZRX7=L|kaVhdhp3R>+hwHR!LP%Dxo=6YFT(9nJq ztqU5TCX+sB8u20`>-9IS`!yNieG-CCJ%L@HL7U5&3px_xZ;P?FR4D%{lXVmNxp5-^ zCl`!-~rHY~o# zzJF}M2A*%|}aMj|yxgk`2( z&wegQAZqqQePMEA_%_{#!3jMr=6gqlR}_B*u~>ri#1o$n1TgY=T^kx;R{o>Tv~wqr zoec^^e%%1*xtiAusGw=bwsWlJo?j5H#7OhFvM%;}T&1;-{>-@HH*jxmI+T^GKG3$u zO`QgHTP(BuB*0-y@X?gcm6FncYSF_i{=I&L%NTkTy0G0RaOHEH`ixvILC1r(P_^j! z?6lyzyCTQFvd!wWl*!8`8>&U}MAEhm$7eqm(}br|*K1``o>wS8(fX~rgs_CC-t;;Y zao}ymS1CERvZI-b@=oM%Nr^}GC5Udz2FX&zI8!XqiZN*&u+ju1m@Nt5_0oP8R)Vy4 z$DKV}ZVBnauD;+e+^Tyu)189OXjJ@u<6?p`+D)(LE+5FmPjH-`F7 zB}q?4^~Sf8B%C%f`l06ojaCPWabgc}X*J0Fz_VdXH;7?wEmNT!f zhu1lsp`)+W+*0;U4VOfmKZ|#%s~I1}?)N!;t9<(-WT)Xo(Pa~FDD?{tM8`D0v4=4f z<K2gE?f3}NpHBRJ#(0?VrYA?x0sQ{@-A0;jn(6J%F$`=2vq z<)(4o!Pn&9!F>s}T-`>IXOSIJY0G&x3vWpsylbyZo=_KPJaxeZ1C);$q8r?(Q6K0f zLvIRDeQx;!(QCMs5b|37V~k)xV%k|b7PC&5ge&bj^KUK{Y;bAKzNo_Z?Yy6T@*u{B zqoYV(vWZk~`#t&;6n%w$)~~zS=L;ds0Y~dOMKg zdufOm-c!)H6c7-X=Pb-61;z9Fzr#ul~vb3YG;9kE>5 z<+0`|jaZ*{XqvlkGilYc!8Ej+2#c(7QZjyGvS3NE$};WlH~Ms}R{qZI>XYO@)+aql z(aHh+sHj%$=%X(xdrYFcS8f+<|cECGt_e*-8;2(}x0Xg~PTqFFG)9 ztcEsjT3O{JY0Qfw<58<=E4(OYFxsQre_4f)opYrY+Z-d6exlR(*+eW+e&bbcL`Y^3 z(d^Ry5(XOI@8bJ?Z=8k;0S}R=TP+EFxjmU-m1q_BLf@tRBX6ODVwFQNj8|Pb*9b3h z{fpQ9!XR-ajT`XO`CTP8Dd&yY5Jeou(xp}c(aAMYASZo;ap`}o0p9;)MR{!igkHwv z)Jnv-F6uBA^yB~by-7`KrT=s^keGW+w+sYuWq(%!fNaN~fYlKj_@rM9ul6?xlLrm~ zXbuVM-?Amh|0j?MXg zx{VQKsempwB=pJOP_hDdtYCZ@_rZoasBIE=h&>S~3BCdxiID)hc zSvDU>f)7H?5`AqfnB_EbPi_nqyS}-1I4pSLOl|j795S^2zT_SQh`JFZu2u-PeDG>F z*7WKst09PW{4ve*F4-%J7}2z_q1DGA`eM-SFDiB{#iB;lN&~O@g=(Cs9{jp8qUfp2 z0O~3TV_{b zROGafcz47?z>oO21{3nJ+RDgkwQSOQ)1y$cLCUl+MM@KQoCZF+W)sz$ zdwSUyb%r+r_#V#yA&+rbqRZpxm0UgBMu^Gu>Xe&Erqh!Is+-?E*#kr~OExBB-XC!I zkAcVlSK;{>59!s^(J6@)v$sMAwV^{r;5(!M@6*s9fs8#4R0^UqxVA(%G$?^P7(WQZ;1sRd?a&Rq-uZ9*iz%l_fzYhJC!C! z9--Tlx%3G44hKBIaR>ay->j=}0#-Ib_+$@RgUzJWk%yz3_z`#r@iq+HSbC5|y!V4- z&`d~I0W)X6fZbznW|mIBW2mc^2l;{GL^;{;;%)!#C$O>`eL14Bexl@scit6|g+DT9 znFI*sLMjl;%3=e$1?MmC^@NIA?HRZZ-72VyxOP+eVmh_U+1$A2hSKkf`6?#vq1GYS z)CL})7}{ee;M@E4!V79qQ&1Wp?`A7R0G`%wh6*ZODUBSt= z$yg(N7!JTLRqxMQ#9o8#sgbK%*`&;3Z|cwmDK#u`EC3_Tsafl#u9y1^4?$rBzn|hvrr?d~#W}J+85UxeuV#oDO4F;vsk-E&uwn zK2EqlUEwo9->O!}p*`}>-WAXW44SObb!5f+LbzgreVQdl_&7(?bTdjUD z_NYVIkA$t$@Z=KZRORJ3-NkCGv-Bh00uY=r0dThL9f(=4yg2;gORUDr+6E03X#kQp z?8P@?{Ts1DM$wmCnc?zbT-gI!N*av&6D0q}MNWa>sRbSvU zhYN@GJt>SWR)(c%{+vYJ*+q<3)HPOxzD9IwqF{H4S1Ds$6yaF8tjEde=po+1?Sr)BTonsepCIYu$-I4MW>x+W9$1%tRfT-=?%e6j zs%KicWA?m+o|zK5+&4?VgeZMKSbNN=7C+dVf z_{dRRYJSaU1nU0rz>}WV&`J-!am_OIdZDi^b}V}6ZdGQM>QE;&CncXlpUz!Q(%vBwJ=}ek(Z{j?9%z+oz0jztuaR>;jeaG$P=$f8 zN4X$F^a+$)9qU@6UW3Fsq9#-vN`H{U4_<_ShWabVZg*`de!*@&lH%YRk}FO-a65y} z`6waSHbO1}7o4sRcMNp04P_)r9Gf1&ucS+++*RS>t2aq&be)m}KcZ*g9^Q;x2_$7J zk@1#B12**i&Ck%r=c)EDC@yu&%>f~p?Ju!7d^f>IIuT;*@z$O(BS)iYNaQ7Jo5wLS z8{r~l1mtspoc`N!I1jc8KN}QU%De13j;K%+8|eM$3K{jL6~FsY@Z%+RA4t*7|a zcl6b-0CfHkkH^aAW8=D4nBAXuOtqW2IH#vrTB|>)ioLA`>w4NLQObBz>N;n>d}dv% z`O4gwk1ce0Z~kO#(P`~4QN;_p?68X95RbJ7S{h6yj)frf4`>j=f4!;`BKE+ex3TP-d`53Y~y=ebdxbCv0r^H%Zf-uUgE=MYDg` zzxA|@SIN>Dzd{fnJjlT0<1oD|v=q+oO#(OP(w^s{UAa|71BTbMn>NQHpQJQSOw^ms>qWyT9-Q6rKoQ0ovvf=xUnc}pG#BS2~+Lk)kpRO@~?B3Vb3%H*;4%y0X{bW3T3ZpPQUo(nv z!w#JEb<*HaBwr!ST^>hiu@L$ zF_+L*g22e8PyS3|Eu?&3 z<|Tyqg~*{|Y+u#7iQFu5w~xm`3#&MS+U2v$D+gTBB0t#X$ z!Goe3Dgj6*!K9wqVk`Rn)qDnHFBi!_!5xN*-8-bebEws7!FrE=127=G43k>v+r3pd zd;Gc8RqnH(o!j2jG-StV-vGZ%yn?9)bC+0u(RWh32^ylV zp$)a3Niw-%L2_y&BRg+Xe*6P!n(G78S;5`v2r{LCca2j9dPY4JT&Z+UyTs(qWXg7|w69mD^Qbu^4^gf|$Y1;N2tHR1LdKYl8Yntbf$KnY^<#oKZ-F;zMl z9qmG(dlNvwjIM-ELz&%|6Vg*8M4Ul(mdf*`mgX`m(yIIgtW*xKb zdxueTTo(#-lL#jao{|Ho)lY)WV4!v*doGuoA^_KDo<3T+oM8KN&nQ~`smIALH0PHU zf>;Q?7N>xhBUk&C%f<~WsXUldxU{Hy1tRg?YcUhFek_e1#DAG|Q)7cAlb%ALaZ`=e z9jJHm^Nbj;V{lr?3~)j|sZZt&`wDrfIw5j4R;mrXq}fN9B_HnhT~urWp_6u(sA6Yn*Pl0vw4h_3Ei z<$j8N;21wpq_4e7@$04Zp|8(0lP>F^8|#Y>imh{{?dgBz%uFJ>FZ+Hx8k_eqcL%4jApseFB_4^dFvlSu-DI^vD0hovIVqENgi{Y3*@lTg2 zF>Ju+@yOn!#f*Lck5$RV8Xk{_au9A2`%tXNh8=UO^hW<2w8yFQcOwk6Iv1<+#%~pv zg_QRCAo!Z*I9r8e3+}%@&$m5QELL7*RHajd97Phu6iA#7R^`(X_Dq6qf8|C!V4 ztrU@Iq4&2l++~u{C{2fZ1@wIDZy!6+&$a_a2PxQq7`PX<=WMX2^%T2Yef7HZLwkHE z#|lQY9fMCH7m#FtgudcW0nrX3N6|(fvY}~f&``2X3Xf!?)l*2DNkg8d%D#7p2Lq3G zE@2x--w$nQ?nBZLR;=Utz}Ps&#Cy5d99)#Wz4U=V4oap8BD@=#$wVgPd zg~n$X$=6=Fy>hEitWoY_a91t>BDjNN&+v`GJ}xDMl+}w@zB4shuXi9Q3}T+B%ZQgr z0A1I7(mwrjr=&v4C4nDRi9V>zm7jM!To# z%dho)IVq$tR2Lcf5e?zze!Fdc(5Ng~FVnR(?*wK}uhU4XGisuteVuovWV8HRr=Qn; z_Y^-Z8Wdp(+RV=`dtt#BBF8-%q&HzssBYGF?>MKo+jshha>1A=L$aHoa0IeIr`2x$ za24R9j7CJhzuEJ;O?x<#%=F~igN?7&Lm9AzeJzN<3Yb%(n(2usM^7onl zp>CWu4SKZ;^(~Ci+Ek)XhVl+@NRHj9l=wN9+7xFNA`oS8QL*woJHQynK`9LOg(Mvu zkhb6MK|^|$9y)gl&B)%T$sjD@b=o@bogmRw2Q+hlV=~~%6f0N*SblDSd-$_aB3p;!7u+h?wa4f5V)X-hpMRUSYIH@6RXS@utX+wBY&oUSz^2ULw) zEFPl&jEJK_MJC!nf|d@b&U)NRNCVc{##Y^}|0b)IVW{QsM^XDK4=~{&0Iuik8r`8H z1deq?SnJI>E&;W3yjyzdm zKsX?xf|v_=G=ocb{3jm8dUL#H{A1ezRYP=3QEv9*^zl3dH{Y|Opfucg_1nX((?ss8 z^j%-hRYYB;f5Q*3#I z=kaY-7skK*z#A7qF3!TTpsar0aM`zvlNIY>?0%&$F$9FNyZYW_cAe;LwoH&4d!+rF z-?1=j2|l*OyXq_jVct~x&SLB!le<*v@TtDgf-r7g*)PR*R9)=vL2Ti=?Isx6PUz=6 zI+3lHd>|&}_ht9veRS37B-C$9DBBE#(fxG!Pb2>}mNk*~s<(kMkfjIm#p<*GB4}1I z@(DDwQxFUDxm_f|7k@T6F46VJ0}VV%{pFod-N!)XNKcz!6d2&4+v0~vl}Y3>x==3L zH=|FDC@PY*1h0QULTbRpwJj%=QQN+2re2OzRO;9E@#FYZs4pAGqjizfAq;d}gp?9) zG4z+%Yb7HieTO`xw`0+>w9+Dp{uScC4B$#QeN0ju5KQJnS>55Z*hyG|U>E*w^fB^M z!Z-I+5n0b{zZ3SASOIz9iD8e!bR34ONWJnYgx|&f=$89rqWTS;UGbymEdsFA3`qqP zBE+I7jDe!V5655H)i>0u=No&qByOCDb~JL^v6cFONT6b5 z>>S!Th&J1^`y9(1Ezq#%(n40b+_G}j$8Sj0+J46VELrg}fyRw*-dXLR#vZV*r=_Tz z;HwFKA;29IfU}J#y+vHoH^^KDF)Q4=1wt|col!t&*O_(?044_aoQWmEB@2HLk_;}t znlyNsa(g&M?U~XZ)b!_Bq07{wxX7!+2J`3#57Ja1#rleU6Fu$xN^+csh0XdL;?)C| zyYfvzK~MV`FTi+S!7k^WuS^UJg0OJyS7Y%^{x$~i>v`l>pO2!%%P)+O9LuGaex8$k z<`F+cXNY%F%w-A)UU`dzX9k?Al12s+h6WW~1=7TA?iyR@g6Y~u=1gY+TyX7AfXf?p z)U!u}N9!GQ?`n)pB=Tdbd4G>op4KjK^cPssCd%r(W0WX}Fcau9hs1~SIYTd13BR$N z^d+0Ht6cwn@hVxb;O$@L>OMnWeCg})Si}u-3!q-z9&_^tS+FjFR5%?Q9P#G z_ED+m_?9+yMg2{W(*qk}LxU@kOdrDGDd44D>jqR^RIkhRB_Kr(iP9B3!Uz%|`Mn~h z1N`Sne+(A~0h5VrnU>f9<5bA{qd@X+ny&{jy{e$1Bp@lyO&>zSnZOtyQWXbn{8M;Gp}XN3iBG})hyD%?G*&f|Ru zxm^`Y-vndnU8x6$!^Id`T_{`=)g}uk{dF@`8go}Ma!Zp69@Q>JY?hMA28)dgpLA|n zC8Wr;GzTu36?!$~TgL}M#7ao#v7xE!*Jlpka)nku^%f)g{LAW`=B`343;A7sP<4N0 zPkY)ecR}`Jw%Ky20tWFmhnJ8h;tgvR$f}Tq`u^yubNIuN>_EIjpnlZ)^q~FP8bMU! zec*nfx#_-o&7sPlenCALmyO0kd7FP*ZK=c^lE&)N-Tqd63s-Z_=BAfzjCZy8Wsc;= z0(tSiSV*sp^~z2t_r%d~?>`_ZyQU`|-x&^^%PnFnm@`xBcRe>BNMAfwDjpRts1@HJ zIbbDw1TV>H0`n%NB3FpSZIPCyr_8EK9Hzk5^-Lf#RA$v8-DRANAEV7&z&IlwiD%^iXQz4$_!}^Yk+xNHmEB3 z=qRT1o+-(SyajY105Zm-Dpme+lzNnVpnT0`YWJ!fLR1j$-tTPt*xX+CG~Y?B2$Ok0l3O#l+kK`tzYADD z$d}!&y?=S&4VEJWVE&7*wnK@x0Q>0eIB>I^$9ZQ3blJeI=k;2tiP@OUALF5y108ym z%{J2_-xOP-p*4%q&zc_UY8Qf(Y9eDn+rQM<2(DY`9(XPca;2JNYG z2|YLA%WwD#Kc@e=xvhOLOV+cZ4O3!x2lgx$^c#te!#}_x53B%kX>XtWL7QQVew)>Y z#09tOCg-242Kyo(jssbeh&6qKTaSKdx}9506%$pbyA#@2Xp9<*pE7|xbM(xN+V8-g zKstkCNW5#OFW&zO2o|5OB~?O!t4XIKx#lLc-fJ{2Td9Aq=6dWszb9Th+8Q=0Zt<(3 zvW>I2mKaGrH`2;!D!1^Ru^t}VjKYLli$)DiQ{On`aRZ$4^wZ2YmN~JBS*z8zpYEFb z&vF)uXfoPgy6hduQK;$t%_O*9BO6!RBh3WYutU#A75{Wsmc{SvqaJ9%tTe`Nwo4aj zJCve(pSv(b=m31>!g>G72G(S=gBO$WSuSkfqG#nCy5*pj*yD^C+46ml1H1Od7G7JW zcgmlSuHwvlB6jsn#=Ub~@+pH*M)+N+-g$y>Z~CFX%neQ%5-@5?!Uk8Ec`$37$h8#~ zZMtmto7bBgEYuUOJ}bHb^6gfwtSw@=b2l|HXXd&EA&PS00uV+4LHsn8uXTISKQmO*;z~#p~h33gw)|2~J3RxpwK1`~EWJi7L)YWf5=wQ@p8fSI z5|0Fb<*Y=wJJZO#e|yE>X1GzQE|VpaYhz8;ytoH?Cs0k~j;PF`nsVHAd46`;hQ> zkSe{a`Ulyc6=_b!%kGro2f5;WnAi;x3@g?n$m&PmHcPr!$(SfR@fzX7Z0g(u1 z_Jdx8;cJ(7mHR|5ez1OSW8mvc{U#H1nu_NE#`|Z19(YC^XQkho2WwzD(O_C@ddkB+ z0F4HMfnm7=s39kfr?`~vf7q1&#j2F)$t?!m4|*l2S3`$+V=~$wGbYEaSeCvyX!o2U zu&7u}H051StT@^z2y}yCV=_F+Qk+VjCFnu6X;~f}&35JkrL!mR9q7V@ORv&+Qdm#-@bYD#yWfsnU)}`?oto6X|y<~PB%P}t0H=)W(@YI77v7C1?s=S~A;cm&SHo+xu zgj!6`{e$D$R_83M_^;Qq)hwiT&C_w(3W;X?NGXY=c{&Mfff(z9egat*0KlcYCEGtB zLDo=T)S~=r`OjNki?axwKYAGP) zJ-cPEzNaa1%whLx?m$NdTleQD3dmyDuZ@wS&miQW(%&_v_>zA>DQ3ZxGsMn=R#cRA zprGCu>8$j39#eQfycC!RivvZ#6)pmTQ=vS8s(qceaX$(sRii{_Pmm0sEEn8Lp% ztQ5hi2u|gMIE!p;ruR1|`V4v2a6QuHqMh#K*J|{zTy|1$CEOWzbThN2>42OJ6Q|$j zY2XQna>VKO z```P6od!YRn?X5K{+s-o;6cIPtW)$pa=wqtP44gY(hO>o;uike-L(eOb@q` z2ySwE6Us)oXf|Vrba|zg`ypla233k~n-+b!+(bmrH1d|EOMMpWQxk{-0)|AR^no(F z3v!Ehtbd-oitQP(lJ>g6XXn=+s<|u3qhgO)SvTFqi33;7E&?)Z7yL_TN~J9j}U;9?1Hk$ zS*^rmer%hQi>vo$1535?kqT3PO1cBMN+RwhqR|HRcE90nz*V1%W6dGiBCjjRG^ZY$DHC4S3LGx)jo$7)dvBi_vctLmA77JP%?@5Rv3Wbh^ zvJ+5TeTSD^)r4FQ5{?^Ew$P6^o~s{iwcZJ3&X4P!>YMKK)+g|wGM!sND#`{zbM^j6mht&iQA58 z*s7g-E{a~Zt2L;NS{5LXVMyBEkNRIL*Y{>!8^nfT_oR;gph6=g>b>>Qf}bl^<6m<# zw-mlAJ36@S66AQB&dGWFn#0Uznbbp*m%_DMDEainuZLEQsgGY@c<6CcSJ>Cwj+?^1 zi@er&RaeBNtz?TD{0Z&^Jh8z*EyscMT4QOyQIzH8Qcm+KClP)Y)Fgxor+cb%_M%gn z{1N3L4Ww$i0e+7Qm~n@~+42P&^|n*sRe;*{bhK&bFZ*U0vhoZg`8|z5HbpiiDfKEJ z9vO>zDMl`7fJTqs$Cf@Gmm=NcsJrFy2|nw2+eoy%x3_ispvSLGvvWq}n%u{aG^;9h z`%9xrM|mc(uHVm)_>bfYzuXA5YmE~Pf{ZJB0jbCjk8XTn56;}`q^7KltfOLN2-^LY za&u9~ZSgAl5(f}^!GPJ06T=&YftJfe3(nUR$>$2DtM)oq+(RTWFz)N*8id=TRIqN7 zGYPyVx`5w=raSSgtM)?|)L=Y6P5Z+ks!CO3HHmYKxu&`;XH&0@MeGZObKY~j(5Br8a35li-tTzuStP`z z9@@*w+Au*cl~5dc_ziWplb_^-3)uh5kBOOuv#pO^vRw|;SZAv3m`GWx0LeMpq-i&}OwICBg5X+WHZXj1e&^y+RAky4q1OFDR*dm#+jPHSsaC9OPA#U& z6zT(X@lbN3cD$S%mVEMdPFMGb}P?XjQsbzsK?czI{ zJ&Sc$sP?s(Xy=chv4Ty~iEvfSC#_yhtSb39?M)i&^+yPGOU()1kc>PUL*LVzwj;_7 ze5!Q*W%7F#kv5%3*o%dtd)KAoIyrZ|^a1#t`BvM_XgEpyG-Pi(i6BPXvzK|&XMlL} z-ZHT1AJB+GkiUGE=bih5#a0mQ@6Tj7oYxyXta8F}0NlwcAAwW;2htpON zCi|Dh8alP<1AtJT4T{9}ruzgz_YcSo%uR6r?I8R6sZ{^hF{W#vR6Tu-H}oIO(uI_F z7Qy#7rmr@7rWi2X^=0g0JDtvd6L$YA@S6fpR<|R->^el>#Y7F}Mz%J0A3VeN-k&@a zcC!_Sy4GD_ZwlPr90`pf2#sQlu#q2WF`TWj3zwe-WiZ@5n=U-yXyx%W)};OyjP|#P z_%T)dUmDy0Yq2v1Dv%4pKHCKu|MiICE&#lz{{IVasyc_eHaJ1UWJRy3yi@CZ(Xm+U zn49gq!WnQwD95;4`%6ujp_<%+$1ahaDGNaTT5dE-S>xuvK16J{BR)}EHi!v2NBxb6 zWX*i4{suANlbLI?Zos$DH;-vEB|iV_HSnRt&shKoPl`hje}&xyGyxwy`$$H*A~x3r zi9bJz*22Om$t>h!bv9!&AY~~9Y!7TByO-|j=?*0QJIl_^a9F_1qbRmQq#fmvGQJ-g z08#Pp0ZQ=)xg=8m=>)kA=={Jkp}th^v6bXzXD!V>ZCoMIdx{bYY;$f_lUwc)jI)vgJ<7c~ksUlv1I7Nu=*QX-Y1HZs{8!^cIXtm9s6>wP7^2i0RPEv^?1&yP zux~XS#mqYvln0l4VMGcZ{42V3ekPYh>_0U-6F(P45;jNtIpo^Z%i*sFz7hb|4vGbp z0xOY$l?G2uSt6?df^AYDpyq?p1Q{DKJ^dxPgA08Ez`R=f|A4mNBGRml+HV|DX;4_( zz^7}1n?N4o?-8(ZzbgmB|CV{3%K(nzlq3ZH*5FID*uSKGndbgH!qR!;$wZ(IRZufT8Rz+kYaa_nU4AJ7AisX$K5S1jF!jWzQbU9kmN2DvQ20NZ)2 zK6I-+RH!`*zd$Y!CEOrN&%2(8ck?p6_ z+jpV>#R3Q@8o#0&sS8~j>#Zy}d0BcAls2n&*kTIxbUAYjx&@@b7?QggXf=()^1R|9 z?-;$E7aC zUFx$lEoZl5u>2!3F$q-hNBk5owk=5c!3+Z;I?l;|KzqpJni#~a!kYDAB6vfp7?4$g z?%7-hw52?Hs_20ShAIii*5^e4cPp2ai!gb%hO~`37^lM-S0R|Fs7^V{&`CstXq5^V zwigOzTUt_zJ7`OYXb8t`r3nih6Lq~j_&223zt(ACV3LfH0>|NNh_{`5*ylg$cY`z| z;{SA>q>Gzb=T--QG4%ZWWUG+(n@upE;`hrn>x=W)mH9Y72EGi{&wmUY+4!xPMDUvk&q@BMzSJ@dpNo+b$$zo6bXjx zSK%j?ujv*hKCypYLq-3mYHc-y?;KrPNm$T7pu$oDWXki9)&BQ4KMp;p4H~$>=>YAFX`12v5Rxm*#AWSZo3(>9IkO0=7 zaz{#EOCR%Pz2?L%tO8lY^v*t@y42XrdgH6nO*hkhiB}E8;1BTftC2dWmTwHXy~R#O zv8t&>We>i+&$2v0ou=#@ZUN6l&&q{m7`WE(WB!Mni+f2d7ajQC(DDrg%3+Owl4g9` z9N7LM8M>AmPoiHplE+x49UQu?O0mc8-(DCrgdM|%&EkbB3dFk@T0myJNenJ?J~1M7 z4asxwEU$|QT4!bpvWnYRuDMQaB|yFtOTdo5GIuN{{irKk#;sol{x{0rJFKa;`x*?O zpdcX9YZOpGq$x-zqI9GSNR0|e6A)<;LqZdj77+mj1*CV7-a`+FfOH7GNG}N`1QPPh z@%_EeH{Ufg*UUA4ge07t!^z=3_r3SpYpvahFAkQsWl0~%b0%b){Gg5t%d0*I-1ZaD zyJNFM!)cLi^SH<9agfVR+Fsf4%S7)id))%E`cqeAVIeDjEKny@rRsM71EoQ9P=Lx# zC)6)ow2fdjU6b)LM%&tK!z8d$@{rTpjX|^fY}f;V}mr(1;1HBL@x@ zuGge&GqC@u;uI~ZyT~R@H<4lizOANzmWy8a8clK`R$#iemghN%R+6`}fE&8J-et)) zW=)`a4J%K+yhZ{)s%-*usa?}2SXmgy!aLQNUIG<2g!&b%hEVMN%ovbDYo7ncKcMl< zb`Lp+#dM-5v~!*d_G&^McQ@Lhpg+5pUK{zwlQ~roM0IYtpfr-8bC&6AbZ+C+IlOA` z{8o~{b0OC`K^l1)pDW^9(fwBjO_G15&2guX{pJf2t;EeHX3ssdxyM`)M6D9NZbUl+QE{+W^#ak+N~ zik1J4pCEIf33GVPZ8{R`X4-9BNq=?Ak8|%C^S}6fe1phrKoNx^cZ8Nv*ggUqE-$X- zYWoLbn053(g4@oeyzkxO`V@L##yz(+3|Yu*p&nLIEOiS=;(4B$ul?p`D{^_+mClt= z=0TLfRq7GNa6qh6gYrxw@LVsn?k<#Rk9nSPyi{E5yYeK(WIQ275o0VW+W@%(S@1nEleGK#HBkl3-LQUSH^ zmAZWsJ-bGOD>0e|TFKAik%SFmiEHMTz1YY$h1F&b<0JR2lEvp$ep|3=qvbUE5(PX7 z7suU5SUkJS7BQ$(qwkWab-Pgd&fYycFe{NnxsXP=i%%;m(#8j1uz{QM%#f+Y=BIqh z@0Bgn!sJE~17Msk=IkrthBYytYygOw?c2DM22R(Tu7JH$NYXO=AsIF5Tnjku66&Nv z%+D4PV3bEP(`^MbSmZ29Jn6p_%kv5K>K9!edoQA0fM$YnjqHyv>y*&eN!1uWs&aqx z#?r1>eJ_f{aom<-e)x8!yea_FITY%)lNhe#_BK@RJ+dK#>d~J`ymMmxxY^e#$lXI! zBye3QW7d?i!gZdAGKbfzwyqT#Iq_Uy4*^$D-~^Cx`3V&}ynYv$?TExVl7nY`?LVX= z-N&^zDA-alsv?!QIUHGES@SKV=l0cS5T$A_2c~q7KkD>aVISUs*d=P-hX1^#S9WI# zoHUQKg%HKTo%55agk+-Cf>*@8Rj+(>X;$3soW>l*Mz2tZ%!v33qdna-!x<)cBO1M& ztKxJqS&8Q;)dyu5FXDCW5TwiCG-n5xi>#}LmD_Yq9w zS}i=$@cWCLJSbK!3+vVklIj49`CRz!X^E4Y+*_SOaYXYM9sQJ?|{_FU9Y&3}qg z$K#ID-@s6d_i#ra{sASsV1Aop|NeF-{_i`~A~1r(-7u7(tfE8X^N?)@$O$3p0}=5H zK=qpLmk!-yLof1I?0K+|#k3=fgE3RzF~g-M_t*eRqy+G%!9BywOj9&K!1UwqVe<&* zfoQ4Y#1zat1sq=h2gF<-)~Z2fz#j?xB_lW|ZIq`6C2Ic-nC2iqOG#B-IO-&`$ zj|x3oYk#cGS9KbQbSRhC_4;iFzPfX2**nMb4lx0)rF?P0>v}H^zHRW;IF8egpkq8@ zKSb|zESUhNF-4szRWaf~;vPlgTXm|XWS*@#?e zgi(8Qu@K?0uKDJnHisbJk%Itcd`|mA2uQ*HyrLGUK&N*t!DJ#{!fqh-vGIy&(G}OM z`~sP%h*DE}^Gz{8&GKD1O0kR&*<%CDZl&n)hU@=;9?!q^X;AmeRXuvj*w2B z%|w;HnQunRNU)Ys;9>a*(^Jdyw}O;BMxu4m^85dQB3Sdw95!#tMEx97d79@kWFyzV zQ!Ka<91RbF|2lOp(Jg{~#HdGcHaFE&TMY=^?zya}8sYwnAm=-Rymr7N%Nq5)V2hA) z_tV6LS=af@m@mRF3$tb>#EKC^_Vm9cGeSw7SpMuj!KHqJh@vp2e+g9r>GOcCY zR3~2q6f^U}EpUS!7dlfYwYlp*(AV}PEv_Q(Jj6+L0mwbs?14z6-Qac%Y~%(Q1C4 zQ(ltTqjziXb}iJp6GM2LGuuP$Wz zULYAKwl8X4Q{YD{8A+cq52OomN^gp>S17jTsPH7`{yER~B}a%Yb65GV6GYg<`@n3I z036fgA#e(LPk=Q3!~fVs{9D-g`)n#t5133?FYI_KtY$b1`>ngVp3(=$F^^~3B=d*= zO$NK@{M7!IH~!w1e;*sbULhf}RUi{}h5zzw%mFR`r`WXaU}0mbh2aq)x|remV_>#> z_~3v(2*hT(yrHG`3H0gz=X0W)KxUD{hQ+n3@%LDfbc;HX)XBg^$hjMpUsNICFNvrM z(UcHI{qV7V6x7^5;3xj3u0}xpkCG3AmAX8|E2aiiW zP(qt+y>@Yj>*V<&1y?!6hIf;6vcJF&3=Kb3FJ~1_a49@B%1uWb=Cb^E#>>b`!DGm8 ztI(%gXYQHMqgbM);xg)l!4-Kl-XQm98V3}5{<|0$yJW;fMGCaOgj8RjsR4t?HnL1Z zeF9(Zh>NwI6D#{UPZTaAvmO|oRl<3fjINNi$K^cS#`#TQ+r=wit6q}V((PrSMd&J{ z$WpQy&ax956fWWO`gLAEn@n73mkxEyDAr~jYC95wK!!_X& z(YK0kJbvFH`gBkzqwHgolY6!+gh_S_9f@Q@2yP(Ms$jVWwy#4xx%g_9v>!n8AUFVH zn4GXY%WvU!otWdBq};%L!*24x4Pq-QzD*lVfJk z54LE~$kOJS9vjqR)af0eZ}8hV(a=>X*-dhhIZbt0=?AuD0@0~tJL;e9hedC1!O1ov3-4HZ&z(TnM z1u*2>Mzoc#3iLmene<4G6!Qb(rPXG5Dtl<2)qUGdJ^6~7TK(0VpRgbORRN6?bD13g z*aAerDiXu{9f#yjoBUKX=b}&)2EQf!c?L2y(MPWOaJ&?5;>^qTp-3qSEX6*K zY=c6c?{Sd>i1Len75#>!fG8E-f(M0NPcQ<{rL9#?Cw`)mi#2YG7^xxDSnhTo4Wv*)n0{lVB#YG@IK;g=|%chX+Ew}NMf}$WNVRjA0H#Tq9TrI%m5j1djLrOFW zc1HTcnGvgkkTC_5M6!50Wv(Fnr_+OrYL+)YdX7)dPtN9&z#ss{v{vJQ&H(;ypcX#Y zl<~a0joON{*wwgar4F{t_PPR9gIFZN1Av#FFk=T72tO9SJus=V^D;G1HjW%n_L7(G zbvp(UO_A;CWvM7=t#cdr%6g#6M1xeMq7DP~M`T!TXt)nD&NSA{n}vC!dyA76c*&Y_|*?_q=`?#%+_FbwABaW+l?R3bT~y zG9UUb*ur-V!e=B(;z5t@fZb_xhaG1jzjkI3sd zg6Ev9i5&!kvkck!a4^nXirN*;NS0axYT5opKp@M?1L2gvO@B893+lR=YcEg!hV%_hDW+}P`;}} zo4@*Umt6y<5TI<)2K9Rb_}DSvgwYq_c5+n*TsDuf_H4Iied0pV#%S01kgVn8RxeiA z^9v!w@iZqs2-65FhUG>nFXkZ|?npNKwQP zy&T{g44HGnez>}k)E7j}DCX%|^3)?@`Oo_Nw?Ig+8oM?y2!W_R6b*B37hoKdyMfb2 zZCmU5PUTAQH+`8-v>($alo2109#94V60N0#*|K&Ani>*CmXOE@g(Vr}ddJ;gYD7&r zFVc1GO{Y`nm7VdGOOVj#IB-PMwdXGm`xqi;g+Ct64lr9cro0jdYast(=ueqB5%U0; zFqgjQMGK2s?l_HYUb5Ad^{5S`X1YVPETgmnTL~p3X+)m@7tW$SU#+NM{r77#yPj7E z;J_0)3e&^08Wk&&0Oe8KNGwEg z6JnV6^@*s`9gSL3-Q&203;hPaPK*#L37T{TnbGe7-wLq{|5sbf|Mi|m)4Y`%0i>zMzM-obn!v-I0SKhLaXu-X9c$!as# z;6=|IEsMZ3^-^Gr*i+a6^C(OzEZP*lz~FKF0Y%dXdraoIqa9~%z`HmRR}Caeoi)#; zA#!C!zR0(8{J*;;d<|}bXw_^S`4Hyivig@Zu74|B@Q>9#{Qm4^k)b}hKT*e58*>+l zGgn1g)LNAw7>ElPk=YrL3bNJBi1>Ohnt7HezHCNBQEs%fhyD~zW#9qPftYSWE49yB zA@pTsPm{?FWCL@UR0S#yxwxh#L6HizmnCx{@v=YxCtxX)nQR5&_1=XLQ%J1a@kpRw z#7d|fh3drQhzud0lJ!o1K@!0nZeW~6iOoICbPFSF^V%r8F<{{?_hYe)cncgV#|yq= zg&U0Z)n&#REtf!Zw8j6G8Osc^`M6v>}V+T4{%<#@fHxCjSqJYttPvXCiba8ILr2i zA5VQ2&jeq@5eg{mJ;X4A0MTR#HoZfk{k_YNj_$##lVywxpW1&d;i@0D$%5*i6;XJ$ z^dhD)_FNx&kF^QmPXHCckZU>{T(Lwc+Q3J*Ug{X$ST`LoLfd2nEZ3nHcN1E4li@Mjw#R7OU zoSd9QxakD5XXq2+L)P7wgC0;WdM`nlFVArjCzeT|tUtQD@UH&bQo+z_sgC$qh9&!u zvi7X=evdEupgIb2j`XA!Qcl*ToashM(u|le9W9wXDC-Pm6kRpZ?%IlHZg+>UVYTjD z?@my>gk-iCx6}eoxfSNFQLh6JSojCTLA+u17FlI2+Y`A-r}yR00hGaL=>5?4VEKBP z2+@k<1qiA-LBE?EvTgP5-4Juy7v?@( zE=f^_M(XL^@t@;IN*u(lXWem)>p5a`42+74(oOiK8^5KgZOWAR;304u(*DQ819i+i zoD@%4JT*RVWyH>|FPL=hFdu*T7yWoDnu8gR2@<=cC+2;a1=a%r&ztwMXh`kBSK>a^ zotm<=ZQNs2P*oa=IL@|bRQ3bOyUL#4Yfly$HKz9D&dJ?Y90Y&6S?&<`2~_p^%|Ia4 zT(a}`e$jI@7;DhIl}rBFTY8V8WKepbSoK+>oEc2%j0q|S^bF~-nSRJ@Mg&S#1!Z>1 z`*Kx}q%n|hSMMXl*BFW~RU|<0par1hd#gZa5=L!GNdJk&-sd0#fu~2Z zR1tEs1`V$B-@wy=i3d&OnvK)J*2z%g*2!<$YZG$NQ#$5>8s9I@b=C7q!Uj{C%D`dM znQ3TpU8sloFhtXWrH_!KM+L)$%3qqhiUA{v&A#t00rDSjZ&$z1@gh8;)`cXxFd4v( zcXsepEj*N;X%eGDX9yn=(Bc2v#4<5Axn01 z8#nMwHP5O)piUe=vV`nF;jnWKZ7H5g5)C0ImcP(62!SqKALZg+#?(7PQS0re*Z|VURjYulZ;%~P^?1@@3CU5k&hLH15bFrbi(DD(vqIv zuyVUiN#_wM*Z|}KIQ_}~FB40Uf^1RvMz4rscIHP5Dpq$HVPCaR5!kz5zUJQw1nc>+ zji-Y20CZ`HpOyB8d!DXn{GaKRu~ZbJ)Lb(Cu+7c_f3=Um+dfpAAf&0KL1bv*`9eff0(wnXH!)>M^{s>ZnzEvYUQG-c6M)( z8g7!#*yKrk`>tCj%`YZ?C&5~70bT7yW}R+>RL?bf1TDG8KD(HK>Z2XNXW9ln;hFpN z85(C34Qp{JDaaasRk6r_tHbTu1;=NGHW-(kxEBTwI$r=KD8{nA$m)UvQr6*M5`(k z(NIM->>rSkD@D$9kFZBHa*Mi-pNKRQ5jvCbA#bfsLKZ@xl`|ZRyN9XkD6M|d&9L>0 zc~a!dQiOm+u8yqvhwIw3N1v(o%(pA5bN(Fj%!SSzml3_t;a76$P%5gm1zQBhLa6v3AY@?B=%B!T>C6u+PbMm4+b=YAdT^pVZc<^Lb~q7se%ea*@B+mglkelrdrM z2+ahE1x6J&j3pBae#jdKReCNm;a43dymGEns-3fKDraYHrVEc=J3a!JJbE%+am5rn zaqFWxpXr!{d}k6*r&IBsgk)mi=NwDSirbQ2MVw66mGG>r2Lvx~m(2LM0V9T)QRTyH z>k{k&{HdYRfo4r(sMV*fn{Uju_A)f>;zX$9ZA4Pma*00{d#cAqAho`zof`@y2zKO` z+T?)ycdbiQ^wP5z6ln`{#5CQCZ=?i9Yn}_4VeXFY7!C37l` zzE1d-w^yTV$m{O7#$L^LU9Z-6$akZD9aZ{3S|!EQXU|@SBu<$XU_2|f-=EOniAXKl zXyq-DGL7!74-ZUKEt;AXVA9mIHqAbH{#I1MlbayxAUoU{Xd0@sV`azki|T&bc?sDc z17h-EYeS1kNwp}?o=nUIGp~9aS2w^Cfj85TY+yPaO;V0}|_ct@RxU zyUD~_oUYmkE_rD#Yo*9DT4(&&$RmV&bxn>?_zk0$cIeS#8?w(=s%-htyE?N9Sztd@ zxzv5upmql_n9#-CW%PDrGZ5}@Wpj>KE9E){e|v?JxHC@;u%EmlpjFHXOz)RO1xJOs z?^>+FbD=syfNR7M#-CQa@zCOj>v_dd~Y5> zOC7d4$~b4Rql}Lk z>{8Pa%W8X%Uuc)(;nCr0H3E!mdwi=&K0qKIAJDFJ+~Hy8xQ|`hr^dq5mP|&Puk=yI z#KaKDmv0oBzYw@>ee{^!+Hv5{S%xM5NRGUW%^IbWx2?ZkP5&xo{$msFv=#T#+uyC* z2PL{GI^dH3A1X|?SA!1_6P!E%s2$d`D@h!0Gs5-G-uf(e2Bs#|8rfG58T4SDn%s^9 z(f-BXV$@4FF_fnpC&RIC9_{5Z57auC)P5(gON7OZMm*zp23%Lww@yaP?8fwc@=DdJ z8-#_AWXE6JRm6-3%NSM{q@TP5I*XDVfYL?!dGeNz!V!6W7I@HHcDMcv#xJ11iH%pQ zfQiY7>Y6%-0i=?*g4x7D1{2IZ<;y>y&jDN7gt854$sIsO8fIbpjLId*-zS%@`N(z8_=LmIY8^jMT1?Gsw}l|iC7 zqD}-zj^;1zo{;rRZEW7seF44HDJyR4c3);DiUN>Yy9vn*et9T(rl^=V!t59(lybEH z7|PN=B~Rpgd`v15n8t_c@^Ef%xI2POTp63x@3r#YW8Z)Y)zpHskU>01z`MtdA%r;;?bCUoDggXT17)KdgNFj zPR85oFCwQQi?n46bgx@vt`B2!tmEJ1qJ;KP8OXB{4A(X`(ujwsO)h)&&-4PRYs=t`r-Up4e5YQ|> zt|;n`+VK{9Mbe^LZK@<}oh1Ws28zNzas4aXUZG8?*mO?WvJfPboD|!Z2ZZ36z@35=W2hNg z7w6&ART4~Qnq z-S}`-(Bsa-DgnQxw0tIU0A>sY;KDZ9CNmszIcTpF#cFN4Ufx`(?)+4lMo1jV-MVKd zP8S}*^3$h@{H08o?bcl0MnhWQaL=SIkm$_aNx3gC#=h{l3oHOb5DvN^IEx+K%%&7& zFJ>2AwsN{(uQ=_q11I_?1O##D9T6apXTTeUB5o1WJ8{?tFFkx8RW#ilAGy2Bf_o{G zUJ}Gfx^qJLi{NCE-A2ddIqq_d`!9aEa6WW7>SUe}1@La0&f}MtYa_`Xw_UKg&8}zF zi>lgQd*^z4Sftl=G3XNji?^Z9!$!rsi z`eOz3Wi4s)z^_p*nl12KuNgIt`NiJVk&-I$CT-PazM#dF(z=c#u8jdhCUc&zg-_dI zG044Rj)CZ-qLkCML$IPCs8EA%?E1mLJGP=BN8S3@I1{L_;9V}B-uIdZLPMRhzt%R-3+QUW z3=}Fvue{pbmKHplnpDlmvnG^D%30@NV283d2G8eE668&~vW4A?f;@*@m?y^H;Q2~m z=@nAwkj9)l(?oca?-LjCHh{7g&wd=!!U_9$+-7}lDM(%;yh1oGdohP=Z3CJEsg&6JqBm_+HeXmuGqR{Tl)0W*l zn4M+$_C~4qH4sMGK?#e2B^`L1&o#_XBZq!Z!2GKW115@45?q&6-7zoW4{@J97R%p_ zbzf;nCKZ?L?byoiWZ@h-APf+zPG{`^&7`V zQ9LUHAY%xd%Z1~#>y$QhtZ!<;(*D}0#IhnNY=$aoFFI#?qtDPTrFPTLbfqFtU<#K? zq4)9&TG|oPCx$IZ__VPQ!^MX8(vQavl1Sg*fhFCy>ej4wk~BMtB-Q!14r-RW=A_PQ zs>`Tgw?|r2Y9nRQ7i>Gc3!(FQNi3OM?T$Vl#SfJq){vNz`5p*s1YbG^Sw?@p|MBCB zZXn<1G<)AA_>ozP=(%gPT}XxV1grY5Fg#G zCfG895GE^ywc}dl+XBx2PErm#8wzz7Cp4ag09_cfnoORStpiyA#Ulhvc^EXZ|E188R7J$rLzJjH7hD@_Y&rnp3gLvLT{6 zP$F+P$xQ^XsC$ zc7c-{?Nw>{0Ap<78?rKdd`@({J_iq^o(3ToQ5$2t2lp76HKC;jCQ65^ryGVU7sy zXo&d6|IuoOvBK^bdVeUHx*X!lNY|DA!)pgw1~AF@!b-_bz!dQ=(80>S%LVer-LKXy z2?L~;dQq1?6YY!Ng^axoE58`+pw3csdZQM40sUm0+Z_cdvWBT z%t$N@3WQXE)xrgL@HvQ+yRs^xw`#}PqA}gHu0}-7=<{?UBExcs*jgsUenG4F(_O_p z_xCliRaKU%?^#_AbN;rVdPoB_j`|N7{NDys=b!wy=TwIOzrO;>ME$ispz2~Xre2F` z#RCylIuqRDx8n$0Gjk)QKc+PzVsqBf9?{I`WitHL#&A8q5zI{lh-j_>xQ}! zsZlsxQPCHHcFQ{(l>h|)C%thvp#zCCM)Ohzm5KvJFi2WE7rYmX4Kd76T{W?1K)zvTc#w?T2uO4z@*}2n5XMrpDEnV1>)w=~PYH0gDE9 z$k&o#!l_k_zxd+I&xVmDwnV@I=lmTG0lDbbc`jKoGTrhys&fY`kLSJytt4=9WAqB1 zj3%pIwDaE-GmEwc+ZXgpSPWOc@p$!cmR@y7CQFpnVW5(HBJLID2Y#Q?(kl);ApMb&bL+kZb$~$m6@DBXJc7iSL&WgU*u91Kib?K^Ln* zu;8Y{74m??Wd|Ahg(e?QO;w@c9rU>eo8IFgcU`ctNejM9={jIP2^s(-PJl>y>-Jvd z01_7NrHJ7f>L{vyHnAK3ww=jJ3JQZB zl4utjYltPw-K)lT_OyPBF%0hs97*K1uUk+pJ2{y$KLmUj)W2n&3#OHJnN!`6U-`|~ z<9G9`^M-D^+nu9~;q~u%Ff+qpKmDTVH#*lETCNV>yviuX53~+b#)~g-h9RV&SX)>^ z2iCJh;{EKU7q;Bb&ENJZ&e&05*qs=MKuc@kfjKLFb@lrH-4>-%Tl8(&2;;(wmqrsIEmSADgJ_E8%NeHJL1 z=TCkAS5XA!q4$iZ0O30+u zA&j|`3VzEzzf~_Ljy*o&f>0QgmohQ`BPjDM-l6y&$K722Aw zFdK7VhbyAT|H&_rjL9ion>vRO{9D7Y1X@VVSJ$9OhA=_JMT_$B?c|@MhbIwJ9yj=; z+ji0-nqOniy|LtfT&Jw_r6X~&Kq@dU=j)Rox0`E8%YfMqo9TbMEQ!9L2f4m5=3~`c ze)IgpRoef_#y`oheKMxf@xgwpi@HDcM3jpCo!X~jN>%uR>17*iFxy>&YxfOAZF#Ig z#xI$hud^A`=zUa5B4l$z7v+GN_d=Vh=dR3AjvD76xp@ZY`0|J<*GY(Yk?g9n`VT10 z`JlK4mmx$^+ePjbq9`otfJ`RL{hWkWP}6;ul&^67y;f!&@U2ge4_jl^Um$2p+OF*n(9Y1WK^D2d2S+}Dc*tTP-cxq#j= zx7D$C%OABA%iM)2x3Xp-Jqwr(HuB(ih}-#TT-pJpA&>Ib&Z`4`!dmqY2rw7_W1GCA zHcer%D_?nC@DJ#_r40_}(02OY$#vHsSk+ipkLUK>`0IHe}Gqa3*e-t$>&F$LJ~ShY^QY)u1`X~nSF(K`j*+y#4rCS z_mi&55iP-5bL+XfOdT!p$w5@&XDlyzku+e2dkZUR%BV-R$?bUT*^fP;7a;<7QlN|g z1CkwY)Go7JqDC}Y?C|tt?BP4dZ{VXZ)mc`4{O5#l#O#u6R@Km`FWT29n0Z>um1jKz za6Gt~BEQ>f!b3&oWaMCSsNnCmx zGo4GC7@mK5%Y!75Kmp{@%48_yNimSY^bc?<}+Ti=HfuqVvZ!A05 zg+hy!c*y%e4l42*Ck1dy%3$IK6V=gY)XH3I9LKecqUXZ4Y)_u68?oPS$`RrDl;B~L zd2mK;UgB_gAmR^FbyKVs75w(>;IbZu>P~N=fDAqn6-<_SUF3FK#lm05DKSy^nzp_8 zGB|X;3KI;VQ>f{;WpHIYjj^kTpo?MndN1pfeWFm=aMO0JNZGp_(<;u!^ZtE=D1zFO zOx@>A4^4uqFDe#|?vWuc9$wRt`L@Xtv_ zRSCP55+H17{|QxF&Jh-x(EXlQSY7KZ@zuU-72~y6YTM=wIU!2r>8y zn3wwaAC#5j?d#1eTC`uZk9|f-mfws7F#};;X4x~GkE*~mQGw~2zT9hU0^f+-Wifyy zZ92}>Lz$pObS<*ln3%9=k=U2V?gW3Hn5k7aLA0WA=4d*^ZvlE-Qe;4({VWkf