
Explore complexity analysis of algorithms, emphasizing correctness and time across input sizes, and master big o notation as the standard for worst-case runtime.
Explore complexity analysis for algorithms, covering time and space complexity with big O notation, asymptotic growth, and worst-case evaluation as input size grows.
Analyze growth rates from constant time to factorial and learn to compare costs with Big-O, include logarithmic, linear, and quadratic terms, and simplify mixed complexities.
Master recursion as the foundation of algorithm design, exploring how recursion works in memory, types and recurrence relations, and how to identify and practice problems, including tail call optimization.
Approach recursive problems by making assumptions, selecting a subproblem, and using its solution to build the original result. Identify the base condition to stop recursion.
Analyze how recursive calls build subsequences by appending characters, uncovering exponential time complexity O(2^n) and linear space complexity O(n) due to depth.
solve the tower of hanoi using recursion by printing moves for moving n disks from from_rod to to_rod using an auxiliary rod, with a base case for one disk.
Design a Python recursive Tower of Hanoi function that moves n-1 disks from from-rod to aux-rod, places the nth disk on to-rod, then moves the n-1 disks to to-rod.
Explore tail recursion and tail call optimization versus regular recursion. See how an accumulator enables a tail-recursive factorial, reduces stack frames, and compilers convert it to iteration at compile time.
Explore how backtracking solves problems recursively by making a series of choices, abandoning failed options, and identifying if a problem can be solved using backtracking.
Implement a solve_maze function to find a path in a 4x4 maze by marking safe cells into a solution matrix, backtracking on dead ends, and reaching the last cell.
Analyze the word search (boggle) complexity by exploring up to eight choices per cell in an m by n grid, yielding time 8^(m*n) and space O(m*n) for recursive calls.
Explore backtracking as an extended recursion technique that lets you change decisions at runtime and backtrack steps, useful in game programming; identify, approach, and solve backtracking problems with confidence.
Divide and conquer splits problems into subproblems, conquers them, and merges results, as a sorted-set search uses the middle element to reduce work to O(log n).
Explore how quick sort uses a pivot to partition an array into left and right subarrays, then recursively sort partitions in place until the whole array is ordered.
Apply the median of medians algorithm to find a median in an unsorted array by dividing into five-element groups and using their median as pivot.
Build a live python implementation of the median of medians algorithm by computing medians of five-element chunks, selecting a pivot via partition, and recursively locating the median.
Explore the greedy technique as a simple approach that makes locally optimal choices in pursuit of global optimum, with examples like coin change and knapsack illustrating its use and limits.
Identify if a problem can be solved using greedy by checking subproblem independence under Metroid; then apply the next-best local choice to build a global solution.
Analyze the complexity of fractional knapsack by sorting items by value-to-weight ratio in decreasing order. The running time is n log n, and space complexity is constant.
Explore interval scheduling in Python by implementing an algorithm: sort by end times, track the last finish, select non-overlapping intervals, and output the optimal schedule.
Analyze complexity for Huffman coding by counting frequencies, generating the tree with a priority queue, and assigning binary codes, yielding time complexity n log k.
Explore the greedy algorithm as a problem-solving technique, learn to identify problems solvable by greedy methods, and practice solving handpicked examples to build real world intuition.
Explore dynamic programming as an optimization over recursion by storing subproblem results to avoid recomputation. Use the Fibonacci sequence to illustrate overlapping subproblems and base cases.
Identify if a problem is a candidate for dynamic programming by checking if it can be split into smaller subproblems with overlap and if it requires an optimal solution.
Analyze the staircase problem's complexity with k=3, comparing recursive, top-down, and bottom-up approaches: recursion yields 3^n time and n space, while bottom-up achieves linear time and space.
Learn how to solve the zero-one knapsack problem with dynamic programming, covering top-down memoization and bottom-up approaches through a live coding example.
Explore the longest decreasing subsequence problem and learn dynamic programming solutions, including top-down and bottom-up approaches, with brute force, memoization, and O(n log n) hints.
Analyze the longest decreasing subsequence using recursion, top-down memoization, and bottom-up methods, showing exponential time for naive recursion and O(n^2) time with memoization, plus O(n) or O(n^2) space.
Explore matrix chain multiplication and derive the minimum number of scalar multiplications using dynamic programming, with top-down and bottom-up approaches.
Learn to implement topological sort in Python using Kahn's algorithm, building a directed graph with an adjacency dictionary, computing in-degrees, and producing a linear order with a queue.
Analyze kahn's algorithm for topological sort and its time complexity O(v+e) by traversing the adjacency list and updating in-degrees. Assess the auxiliary space O(v) for the vertex queue.
Algorithm Design Techniques: Live problem-solving in Python
Algorithms are everywhere. One great algorithm applied sensibly can result in a System like GOOGLE!
Completer scientists have worked for 100s of years and derived some of the techniques that can be applied to write and design algorithms.
So Why to reinvent the wheel ??
Let’s go through some of the most famous algorithm design techniques in this course.
Once you will come to know these design techniques It will become very easy for you to approach a problem by identifying which technique to apply to solve that correctly and efficiently.
0. Complexity analysis
1. Recursion is the base of any algorithm design
2. Backtracking
3. Divide and Conquer
4. Greedy algorithms
5. Dynamic programming
6. Trees
7. Graphs
And WE WILL WRITE THE CODE LINE BY LINE IN PYTHON !!
By the end of this course -
1. You will understand how to design algorithms
2. A lot of coding practice and design live problems in Java
3. Algorithm Complexity analysis
AND
If you are preparing for your coding Interview or doing competitive programming This course will be a big help for you.
THRILLED? I welcome you to the course and I am sure this will be fun!!
If it does not - It comes with a 30 Days money-back guarantee so don’t think twice to give it a shot.
Happy Learning
Basics>Strong;