
Learn why algorithms solve problems efficiently by modeling steps as finite, rule-based instructions. Analyze and compare algorithms to predict time, resources, and complexity, including space and time.
Install the Java development kit on Windows from Oracle, accept the license, run the installer, verify versions with java and javac, and prepare to use IntelliJ IDEA.
analyze algorithms by time and space complexity, using experimental and theoretical (mathematical) analysis to measure running time, count primitive operations, and derive order of growth.
Analyze order of growth as input size increases, ignoring constants, and explain how loop patterns—from no loops to nested loops—produce constant, linear, logarithmic, quadratic, cubic, and exponential growth.
Explore asymptotic analysis to measure algorithm performance by order of growth, focusing on big O, Omega, and Theta bounds, and analyzing best, worst, and average cases.
Analyze memory usage and space complexity, focusing on bytes and bits, data types, and arrays that determine an algorithm’s memory footprint.
Learn how recursion works, including base cases, recursive calls, and how a function calls itself until termination. See examples that compare recursion with iterative approaches.
Analyze the time complexity of recursive functions using recurrence relations, derive the recurrence from a square function, and prove linear time using the substitution method.
Explore solving a recurrence relation using the substitution method, derive T(n) = T(n-1) + n, sum of natural numbers, and conclude time complexity is O(n^2).
Explore tail and head recursion in Java through practical demos that compute squares, showing how placing the recursive call at the end versus the beginning changes execution and output.
Explore the linear search algorithm, a sequential method that scans an array element by element to find a key, returning its index or -1, with worst-case time complexity O(n).
Explore stable and unstable sorting, focusing on how duplicates affect ordering and how stable sorts preserve the original order of equal elements when sorting in ascending order.
Analyze the selection sort algorithm by selecting the smallest unsorted element in each round, swapping it into place, and examining its time complexity and instability.
Learn to implement insurgents' algorithm (insertion sort) in Java by creating a class, a method insertionSaqr, and a display helper; run with an array to show original and sorted sequences.
Learn how Shell sort uses decreasing gaps to compare and swap elements, moving them toward proper positions, until the final pass with a gap of one.
Implement the shell sort algorithm in Java with a public void shellStart method. Show gap halving and in-place insertion, plus a display method to print arrays before and after sorting.
Merge sort uses a divide-and-conquer, recursive approach that splits an array by mid = floor((left + right)/2), sorts left and right subarrays, and merges them.
Explain how quicksort uses a pivot and partitioning to sort by divide and conquer, recursively sorting left and right subarrays.
Quicksort partitions data into two subsets and recursively sorts them, yielding n log n time, with worst-case n^2 when input is already sorted and the first element is pivot.
Summarize the time and space complexities of sorting algorithms, comparing comparison-based and index-based methods, and noting best, average, worst cases and stability.
Create a node class with element and next, where next references the following node, and initialize it with a constructor to build and link nodes into a linked list.
Learn to implement the append operation for a linked list: create a new node, update head and tail when empty, link nodes, and increment size with constant time complexity.
Learn to implement a Java linked list by defining a node class and a list with head, tail, and size; add elements, compute length, check emptiness, and display.
Insert a node at any position in the linked list by traversing from the head to the target position, linking the new node, updating the size, and analyzing time complexity.
Learn how to implement a remove first method in a Java linked list to delete the head node, handle empty lists, update size, and return the removed element.
Implement a remove last method in the list to delete the end element, handle empty lists, and update size. Traverse to last-but-one node, update pointers, and return the removed element.
Implement a remove any method in a linked list to delete an element at a given position, handle invalid positions, traverse to the previous node, and return the removed element.
Learn how to search for an element in a linked list by traversing from head to tail, using a key, and returning the index or -1 with worst-case time complexity.
Illustrate circular linked list by showing last node points to the first, creating a circular pattern with head and tail references; discuss single-node edge case where next points to itself.
Create a circular linked list by inserting nodes, updating head and tail, and linking the last node back to the first. Analyze the constant-time insertions and the overall time complexity.
Insert an element at the beginning of a circular linked list by creating a new node, linking it to the first node, updating head, and increasing size in O(1) time.
Insert a new node at any position in a circular linked list by traversing to the target, updating links correctly, increasing the size, and analyzing time complexity.
Implement a method to insert an element at any position in a circular linked list, validating bounds, traversing to the position, updating links, and increasing size with examples.
Learn how to implement a removeFirst method to delete the element at the beginning of a circular linked list in Java, handling empty lists, head updates, and size.
Remove the last node in a circular linked list by traversing to the node before the tail, update the tail, reconnect to head, and return the deleted element.
Learn to implement a remove-last method for a circular linked list in Java. Handle empty lists, traverse to the last-but-one node, update pointers, retrieve the removed element, and update size.
implement a remove-at-position method for a circular linked list, validating the position, traversing to the preceding node, unlinking the target, returning the removed element, and updating size.
Examine what a doubly linked list is, with nodes linking to next and previous elements, enabling efficient insertions and deletions, especially at the end, compared to a single linked list.
Explore how a doubly linked list uses head and tail references, next and previous links, and null guards to traverse from head to tail and backward, with practical examples.
Demonstrates creating a doubly linked list by inserting nodes, initializing head and tail, updating next and previous references, and tracking size with constant time complexity.
Learn how to insert a node at any position in a doubly linked list by traversing to the target position and updating next and previous references, then increase size.
Explore implementing a stack with arrays, using last in, first out, and core operations push, pop, and top, including checks for full and empty states.
This course will help you in better understanding of the basics of Data Structures and how algorithms are implemented in Java. This course consists of Videos which covers the theory concepts + implementation in Java.
There’s tons of concepts and content in this course:
Basics of data structures & Algorithms
Analysis of Algorithms (Big O, Time and Space complexity)
Recursion & Analysis of Recursive Algorithms
Searching Algorithms
Sorting Algorithms
Linked List
Stacks
Queues
Binary Trees
Binary Search Trees
Balanced Binary Search Trees
Priority Queues and Heaps
Hashing
Graphs
Graph Traversal Algorithms
Followed by Advanced Topics of Algorithms:
Sets and Disjoint Sets
Divide and Conquer Approach - Introduction
Divide and Conquer - Binary Search
Divide and Conquer - Finding Maximum and Mininum
Divide and Conquer - Merge Sort
Divide and Conquer - Quick Sort
Divide and Conquer - Selection Algorithm
Divide and Conquer - Strassens Matrix Multiplication
Divide and Conquer - Closest Pair
Divide and Conquer - Convex Hull
Greedy Method - Introduction
Greedy Method - Knapsack Problem
Greedy Method - Job Sequencing with Deadlines
Greedy Method - Mininum Cost Spanning Tree (Prim's & Kruskal's Algorithms)
Greedy Method - Optimal Storage on Trees
Greedy Method - Optimal Merge Pattern
Greedy Method - Single Source Shortest Path (Dijkstra's Algorithm)
Dynamic Programming - Introduction
Dynamic Programming - Multistage Graphs
Dynamic Programming - All Pairs Shortest Path
Dynamic Programming - Single Source Shortest Path
Dynamic Programming - Optimal Binary Search Trees
Dynamic Programming - 0/1 Knapsack Problem
Dynamic Programming - Reliability Design
Dynamic Programming - Travelling Salespersons Problem
Backtracking - Introduction
Backtracking - n-Queesn Problem
Backtracking - Sum of Subsets Problem
Backtracking - Graph Coloring Problem
Backtracking - Hamiltonian Cycles Problem
Backtracking - 0/1 Knapsack Problem
Branch & Bound - Introduction
Branch & Bound - n-Queens Problem
Branch & Bound - Job Sequencing Problem
Branch & Bound - 0/1 Knapsack Problem
Again, each of these sections includes detailed videos tutorial.