
Explore primitive data types such as integer, float, and boolean, and compare them with user-defined types like objects and classes, noting memory and compiler differences across C, Java, and Python.
Define algorithms as step-by-step instructions that convert input to output. Examine examples from arithmetic, largest of three numbers, quadratic roots, and basic sorting, plus real world applications.
Explore what data structures are and how they store and organize data for efficient access. Choose a structure for your project using arrays, 2d arrays, and queues.
Explore linear and nonlinear data structures, including arrays, linked lists, stacks, queues, trees, graphs, and matrices. See their real-world applications in image processing, web browsing, and maps with Dijkstra's algorithm.
Analyze algorithms by comparing running time and space as functions of input size, using sorting methods such as insertion, selection, and quick sort to determine the most efficient approach.
Identify the rate of growth as the highest-degree term of a function, introduce big O notation, and compare running times from array access to binary search, linear search, and sorts.
Analyze algorithms by comparing best case, worst case, and average case inputs to estimate fastest, slowest, and average running times, using lower and upper bounds.
Explore big o notation as the upper bound of a function’s growth rate, classifying algorithms by their time or space requirements as input size increases.
Explore big o visualization and order of growth, learning how o(1), o(n), o(n^2), and log n compare, with constants and practical examples.
Determine the upper bound by selecting the highest-degree term and ignoring constants. Use examples 3n+8, n^2+1, and n^4+n^2+50 to illustrate.
Explain how omega notation defines the lower bound of a function's growth, contrast it with upper-bound O notation, and illustrate with examples like f(n) = n^2.
Explore theta notation and how upper and lower bounds match, making the average running time lie between them; if bounds differ, consider all complexities and average them.
Explore core time complexity concepts, distinguishing constant time operations (O(1)) from linear time (O(n)) and examining how input size drives execution, with card-search and loop examples illustrated.
Explore time complexity types, including logarithmic, linear, and quadratic, with examples like binary search and nested loops to illustrate time complexity.
Apply asymptotic rules to determine running times from loops, including inner and outer loops and the O(n^2) term. Analyze worst-case if-else and logarithmic cases, including binary search patterns.
Explain space complexity as memory usage, including input and extra space, with byte costs (boolean one byte, short two, int four, long eight) and a 12-byte constant example showing O(1).
Analyze the space complexity of the function that takes an input array a and a few integers, showing linear space complexity, O(n), with four bytes per int.
Analyze the time complexity of a simple program with a constant input, multiple print statements, and constant declarations, showing the overall complexity is O(1).
Explore time complexity by analyzing a sample method with two loops over an array, showing how total work scales with array length and yields O(n).
Analyze the time complexity of a for loop that doubles i each iteration and prints a message; for input eight the loop executes three times, illustrating a logarithmic time complexity.
Analyze a method with an outer loop over n and a nested inner loop over n, yielding a total time complexity of O(n^2).
Analyze time complexity of a nested loop: the outer loop runs to N, while the inner loop doubles J, yielding logarithmic iterations per outer pass and N log N growth.
Practice analyzing the time complexity of a for loop that runs from 1 to 2^n, demonstrating that the loop executes 2^n iterations and yields O(2^n) time complexity.
Explore the time complexity of a for loop that runs up to the factorial of n, revealing an O(n!) growth and highlighting factorial-based iterations as a very costly, worst-case algorithm.
Analyze the time complexity of a nested loop with i from 0 to n-1 and j from i+1 to n-1, yielding n(n-1)/2 iterations.
Analyze a function that prints hello inside two nested loops over arrays a and b. Conclude its time complexity is O(a × b), not a square.
Analyze the time complexity of the print high function with three nested loops over the lengths of arrays a and b, yielding a times b in big-o terms.
Analyze the time complexity of a prime-checking method that uses a for loop from 2 to sqrt(n) with modulo tests, revealing a sqrt(n) running time.
Analyze the time complexity of a straightforward recursive factorial function, identify base cases, and understand how each decrement affects the worst-case Big-O growth.
Explore the time complexity of a recursive Fibonacci function, introduce big-O notation, and show that its exponential runtime is closer to 1.6^n rather than 2^n.
Compute the time complexity of a loop from 0 to n that calls fib. The Fibonacci call yields exponential growth, making the overall complexity n times 2^n.
analyze a loop-based function that computes a product by summing from zero to b, revealing its time complexity O(b).
Assess the time complexity of a function with inputs a and b, exploring modulo and division operations, conditional paths, and constant-time arithmetic relevant to big O notation.
An exercise analyzes the time complexity of a function with parameters a and b. It notes a loop from b to a updating sum and count, giving O(a/b).
Analyze the time complexity of the square root function by looping until the square of the guess exceeds n, showing the iterations grow as the square root of n.
This lecture analyzes the time complexity of some digits function, which sums digits by modulo 10 and division by 10; iterations equal number of digits, roughly log10 of the input.
Listen carefully to the problem, draw a flowchart-style whiteboard example to reveal information, then start with brute force, optimize, implement, and test for efficient algorithms.
Explore recursion as a method that calls itself, revealing the balance between compact solutions and complexity, using a Java example that prints hello until a stopping condition is met.
Explore the difference between recursive and iterative approaches in data structures and algorithms, compare memory usage and stack depth, and show how tail recursion enables compiler optimization toward iteration.
Analyze the factorial method and recursion by stepping through factorial(5) in Java, highlighting base case n == 1 and factorial(n-1). Explain how recursion stops and avoids memory issues.
Explore how the Fibonacci series is computed by recursion, using base cases F(0)=0 and F(1)=1, and the recurrence F(n)=F(n-1)+F(n-2) in Java, with an input of five.
Learn how recursion works in function f1, where x equals zero returns y and recursion uses x minus one and x plus y, with x=4 and y=7.
Explain the recursive function that halves n using integer division until 1, with base case n==1 returning 0, illustrated by f(4)=2 and f(5)=2.
Explore recursion by converting decimal numbers to binary using divide by two and modulo two, printing bits as the recursive calls unwind to reveal the binary representation.
Analyze a recursive C function that calls f(n-1) before printing a growing star pattern for n. Build intuition for the pattern where the total stars equal n(n+1)/2.
Explore recursion through a power function, demonstrating how to compute a^b by recursively reducing b and returning a^b, illustrated with 4^3 = 64.
Learn how arrays store multiple elements of the same type in a fixed-size container, using zero-based indexing to access elements by index, with examples in C, Java, and Python.
Learn how arrays store primitives and objects, access elements by index from zero to length minus one, and use a for loop to initialize and print each element.
Insert 60 at index 2 in the array by shifting elements, then examine the backward shift loop and the best-case and worst-case complexities.
Explore searching an element in an array with a for loop, returning 1 if found or -1 if not, and understand best and worst case behavior with zero-based indexing.
Learn how to remove a specific element from an array by locating it, removing it, and shifting the rest to fill the gap using a for loop.
Learn to rotate an array to the right by one position using a rotate-right function, a temp variable, and a backward loop that moves the last element to the front.
Remove duplicates from a sorted array by comparing adjacent elements, increment a length counter when duplicates are found, shift elements to fill gaps, and return the resulting length.
Explore multidimensional arrays by treating them as matrices, declare and instantiate two-dimensional arrays with rows and columns, access elements by row and column indices, and compute each row’s length.
Learn how to print elements of a 2d array using nested for loops and the for-each loop variant in Java, iterating through rows and columns with indices i and j.
Explore multidimensional arrays by modeling a 3d array as a collection of 2d arrays, using three nested loops to print and access elements with zero-based sheet, row, and column indices.
Insert elements into a 2d array with two rows and four columns by reading user input via a scanner and storing values by row and column using nested loops.
Update elements in a two-dimensional array by directly indexing the second row, third column, updating seven to ninety nine, illustrating O(1) access and the advantages of arrays.
Search a 2d array for a specific value using nested loops over rows and columns, returning the found element and noting the time complexity of O(rows*cols).
Deleting an element from a 2D matrix means replacing the target cell with the minimum integer value (or -1) rather than shifting elements, enabling a constant-time update.
Analyze the time and space complexity of array operations, including creating, inserting, traversing, accessing, and deleting elements, with space scaling by rows times columns.
Analyze the time and space complexity of arrays, including O(1) operations for creating empty arrays and accessing or updating a known position, and the memory impact of array length.
Calculate the average of array elements by summing values with a loop and dividing by the array length, implemented in Java (also applicable to C/C++ and Python).
Implement a contains function that searches an int array for a given value using a for-each loop, returning true when found and false otherwise.
Practice removing an array element by shifting subsequent elements left with a for loop and index. In a fixed-size array, replace each element with its successor, causing end duplication.
Find the maximum and minimum in an integer array by initializing max and min to the first element and iterating with a for-each loop to update them as needed.
Practice reversing an array with a loop and a temp variable, swapping symmetric elements up to halfway, and printing the reversed result.
Implement a two nested loops approach to find duplicates in an array by comparing each element with subsequent elements and printing matches like the repeated 4.
Find the common elements between two arrays by using a nested loop approach, comparing each element of the first array with all elements of the second array.
Add two matrices of the same size by summing corresponding elements and printing the resulting matrix, using two-dimensional arrays and nested loops.
Learn to rotate an array clockwise by moving the last element to the front, implementing a rotateArray method, and displaying original and rotated arrays to verify the shift.
shuffle an array using a random index and swap elements to achieve random ordering; demonstrates with a sample numbers array and mentions applications in card games.
Create a linked list by defining a node with data and a next pointer, allocate memory for nodes, assign values, and link head to middle and last.
Prints linked list node data by traversing forward to output each value, then prints in reverse using a recursive approach, illustrating traversal, recursion, and time and space complexities.
This lecture demonstrates printing a linked list in reverse using recursion, detailing the print recursively reversely method and the base case null.
Insert a node at the beginning of a singly linked list by creating a new node, assigning its data, and updating the head to the new node.
Insert a node at end of a linked list in C and Java by creating a node with next as null and traversing to the last node, achieving O(n) time.
Learn to insert a new node after a given node in a linked list using C or Java, with null checks, node allocation, data assignment, and pointer updates.
Delete a node with a given key from a linked list by searching for the key, handling head cases, and freeing the removed node.
Learn to implement a search in a singly linked list that returns the key’s index or minus one if not found, using a head pointer and next links.
Retrieve the nth node of a linked list by traversing from the head with a temp pointer and a counter, returning data or -1 if out of range.
Implement a get length method that returns the length of a linked list. Start at the head, use a temp cursor to count nodes until null, then return the count.
Learn two algorithms to find the middle node of a linked list: a two-pointer approach with fast and slow pointers, and a length-based method that advances to the middle.
Detect a loop in a linked list using two pointers, fast and slow, where fast moves two steps and slow moves one, until they meet to signal a loop.
learn how to reverse a linked list in c and java by implementing a reverse list function using three pointers—current, previous, and next—and iterating until null.
Implement a singly linked list in Java by creating a node class, a head reference, and linking nodes through next pointers, as demonstrated with three nodes.
Print a linked list starting from head by traversing each node and printing its data until reaching null, as demonstrated with three nodes containing 1, 2, and 3.
Push a node at the beginning of a linked list in C and Java by creating a new node, linking it to the head, updating the head; test with prints.
Add a new node after a given node in a linked list, linking nodes, pushing at the beginning, printing the list, and testing by inserting after the second node.
Implement a public void append node function to add a node at the end of a linked list. If empty, set head to the new node; else traverse to end.
Delete a node with a specific key in a singly linked list by handling head deletion, searching for the key, unlinking the node, and freeing memory in C and Java.
Implement a delete function for a linked list that removes a node at a position, handling empty lists and bounds, with a sample removing the tail from [4,1,5,3,6] to [4,1,5,3].
Learn to count nodes in a linked list both iteratively and recursively, implementing get count methods in C and Java and verifying they produce the same results.
Implement an iterative search in a singly linked list using a boolean search method that traverses from head, compares node data to the target, and returns true if found.
Implement a recursive search for a specific value in a linked list by converting the iterative method, using a base case from head to next.
Extract the data value from a node at a given index using iterative and recursive methods, traversing with a current pointer and count, returning data or zero if not found.
Develop a recursive method to retrieve the data value at a given index in a linked list, transforming from the prior iterative approach and reinforcing base and breaking cases.
Learn to remove duplicates from a linked list by using an outer and inner loop to compare nodes and delete duplicates, demonstrated with a sample list and printouts.
Reverse a linked list iteratively by updating previous, current, and next pointers, print the list, and explore recursive approach in C and Java.
Implement a function to reverse a linked list recursively, handling base cases of no or one node, then reverse the rest and verify with a test.
Rotate a linked list clockwise by moving the last node to the front, repeated k times, with k less than the size and proper handling when k equals zero.
Explore how a doubly linked list uses previous and next pointers, allocate three nodes with data 100, 200, 300, and link head, middle, and last to form the structure.
Learn how to print a doubly linked list from head to tail using next pointers, and from tail to head using previous pointers, printing each node's data.
Explore the advantages and disadvantages of doubly linked lists, including bidirectional traversal and efficient deletion when given a node pointer, with the extra space required for a previous pointer.
Learn to insert a node at the beginning of a doubly linked list, updating head, next, and previous pointers, with memory allocation in C and Java.
Learn to insert a node at the end of a doubly linked list by linking the last and new nodes, handling empty and non-empty cases in C and Java.
Learn how to search a doubly linked list for a key by traversing from the head, comparing each node's data, and returning the node index or -1 if not found.
Learn to delete a node from a doubly linked list using two pointers, search for the key, and handle head, tail, and middle deletions with freeing memory.
Implement a doubly linked list in Java by defining a node with data, next, and previous references, and building a push method to insert at the front.
Insert a new node at the beginning of the list in Java by linking the new node to the head, updating the head, and adjusting the old head's previous pointer.
Print a doubly linked list from its head to tail and in reverse. Implement forward and reverse print functions that traverse using next and previous references.
Learn to implement a Java append-at-the-end operation for a linked list by appending notes at the end, handling empty lists, and updating next and previous references.
Validate the previous node and a non-empty list, create a new node with the given data, and update next and previous references to insert it after the previous node.
Learn to delete a specified node from a doubly linked list in Java, updating head, next, and previous references while preserving linkage for all cases.
Learn how to delete a node at a specific position in a linked list by traversing to the target node, validating the position, and invoking a delete node method.
Practice reversing a doubly linked list in Java by swapping next and previous pointers across nodes, handling empty or single-node lists, and updating the head to the reversed list.
Write a function to determine the size of a doubly linked list by traversing from the head with a counter and returning the node count.
Rotate a doubly linked list by n positions counterclockwise, updating next and prev pointers and the head to produce the rotated sequence.
This lecture explains circular linked lists, where the last node points to the head to form a circle, and covers creating nodes, memory allocation, and next pointers.
Learn a simple method to print a circular linked list in C: start at the head, traverse with a cursor, and print each data value until returning to the head.
Learn to insert a node at the beginning of a circular linked list by updating the last node's next pointer and the new node's next to the head.
Insert a node at the beginning of a circular linked list; empty lists link the new node to itself, while non-empty lists traverse to the last node.
Insert a new node at end of a circular linked list by creating the node, setting its data, and linking it to head—time complexity: constant for empty lists, linear otherwise.
Explore searching a value in a circular linked list by traversing from the head, comparing node data to the key, and returning the node or -1 with time complexity notes.
Learn how to delete a node in a circular linked list by handling four cases, including empty, single-node, head deletion, and middle or end deletions.
Implement a circular linked list in Java by creating a node with data and next, linking the last node to the head, and implementing a print traversal.
Learn how to push nodes to the beginning of a circular linked list in Java, updating head and last pointers and printing the list, with time complexity O(n).
append nodes at the end of a circular linked list using the last pointer, handling the empty list by linking the node to itself and updating last.
Implement a function to add a new node after a given node in a circular linked list, updating next references and returning the appropriate last node.
Delete a specific node from a circular linked list by searching for a key, handling empty lists, single-node, head, last, and in-between cases, and updating links accordingly.
Demonstrate counting the nodes in a circular linked list by starting at the head, traversing until it loops back, and returning the node count.
Exercise 72 traverses a circular linked list to find and print the minimum and maximum node values, updating min and max as you go, with time complexity O(n).
Develop a function to sum nodes in a circular linked list by traversing from the head. Update a running total during traversal and return the final sum.
Explore how a stack, a last in, first out data structure, manages elements from the top of the stack, with push and pop operations, illustrated by browser back navigation.
Explore the push operation for an array-based stack, inserting elements at the top and updating the top index, while checking for full capacity and noting constant time O(1) performance.
Learn how to remove data from a stack by popping the top element using an array-based stack, check for emptiness with top == -1, and perform operations in constant time.
Learn stack operations in C, including push, pop, and peak the top without removing it. Check is empty and is full, understand top, capacity, and how to print all elements.
Explore stack creation using an array and a linked list, compare static and dynamic stacks in C and Java, and learn push and pop operations for efficient data handling.
Learn to implement a stack in C using a stack struct with an items array, a max capacity, and a top index, including push, pop, and empty and full checks.
Learn to implement an array-based stack in Java, compare with linked-list stacks, and provide push, pop, isEmpty, isFull, size, and printStack.
Reverse a stack using recursion by inserting each popped element at the bottom, creating the reversed order. Practice with the peak function, pop and print steps, and test the implementation.
Sort a stack using recursion by removing the top, recursively sorting the remaining stack, and inserting elements back in increasing order with a dedicated sorted insert method.
Sort a stack using a temporary stack with an iterative approach to place elements in decreasing order, building on a prior recursive method.
Explore the queue data structure, a first-in, first-out abstract data type, and practice adding and removing elements while checking is empty, is full, and peak at the front.
Enqueue adds items to an array-based queue using front and rear indices; the lecture walks through a three-element queue implemented in C.
Learn how to remove items from a queue using the deck method. The lecture shows front and rear checks, printing elements (100, 200, 300) as front advances for constant-time operations.
Demonstrates a fixed-size array queue in C with enqueue and dequeue operations, front and rear management, and full/empty checks, including display and tests, plus a Java version.
Implement a queue data structure in java using an array, with front and rear pointers, enqueue and dequeue operations, capacity checks, and a display method, demonstrated through a five-element example.
Implement a Java queue using a linked list, building a queue node class, managing front and rear pointers, and providing enqueue and dequeue operations.
Explore the circular queue, an extended queue that wraps the rear to the front to reuse space, with front pointing to the oldest element and rear to the newest.
Implement a circular queue in C using an array with front and rear indices and modulo size for enqueue, dequeue, and display; the next video covers Java.
Explore implementing a circular queue in Java, with array-based structure, front and rear pointers, full and empty checks, inserting elements, and a display method using modulo logic.
Understand how a priority queue serves elements by priority, removing the highest priority first and preserving the insertion order for equal priorities, with heaps offering an efficient implementation.
Explore the deque data structure, enabling insertion and removal from both ends, including input restricted and output restricted decks, with circular and linear array implementations, and overflow handling.
Learn deck insertion at the front and rear, updating front and rear pointers and implementing in C and Java with full or empty checks.
Explore a deque implementation in C, including add front and add rear operations, delete from front and rear, display, and count, with front and rear pointer management and empty checks.
Implement a deck in Java using an array-based structure with front and rear pointers. It covers insert front, insert rear, delete front, delete rear, and isFull and isEmpty checks.
Want to land a job at a great tech company like Google, Microsoft, Facebook, Netflix, Amazon, or other companies but you are intimidated by the interview process and the coding questions? Do you find yourself feeling like you get "stuck" every time you get asked a coding question? This course is your answer. Using the strategies, lessons, and exercises in this course, you will learn how to land offers from all sorts of companies.
Many developers who are "self taught", feel that one of the main disadvantages they face compared to college educated graduates in computer science is the fact that they don't have knowledge about algorithms, data structures and the notorious Big-O Notation. Get on the same level as someone with computer science degree by learning the fundamental building blocks of computer science which will give you a big boost during interviews. You will also get access to our private online chat community with thousands of developers online to help you get through the course.
Here is what you will learn in this course:
1. Big O notation
2. Data structures:
* Arrays
* Hash Tables
* Singly Linked Lists
* Doubly Linked Lists
* Queues
* Stacks
* Trees (BST, AVL Trees, Binary Heaps)
* Tries
* Graphs
3. Algorithms:
* Recursion
* Sorting
* Searching
* Tree Traversal
* Breadth First Search
* Depth First Search
* Dynamic Programming
Unlike most instructors, I am not a marketer or a salesperson. I am a senior developer and programmer who has worked and managed teams of engineers and have been in these interviews both as an interviewee as well as the interviewer.
My job as an instructor will be successful if I am able to help you become better at interviewing and land more jobs. This one skill can really change the course of your career and I hope you sign up today to see what it can do for your career!
Taught by:
Abbass Masri is the instructor of the highest rated Android App Development course on Udemy as well as one of the fastest growing. His graduates have moved on to work for some of the biggest tech companies around the world like Apple, Google, JP Morgan, IBM, etc...
Also, he is running a successful app on playstore that teaches around 1,000,000 users coding in many languages like: Android, Java, C++, Python, Arduino, and more.. Please check it here on playstore: "Master Coding App"
Abbass promises you that there are no other courses out there as comprehensive and as well explained. He believes that in order to learn anything of value, you need to start with the foundation and develop the roots of the tree. Only from there will you be able to learn concepts and specific skills(leaves) that connect to the foundation. Learning becomes exponential when structured in this way.