Learn the principles behind fundamental computer science algorihms asked on interviews for top tech companies.

**What you'll learn**

- Having higher chances to get a job in a place where algorithmic problem solving is a part of interview.
- Have one more tool during coding interviews.
- Better understanding of principles behind fundamental computer science algorihms.
- Becoming a better problem solver.

**Description**

WHAT IS THIS COURSE ABOUT?

In this course we will together make the first steps in the exciting world of algorithms. If you have never learned anything about algorithms, don’t be afraid or intimidated. Algorithms aren’t as hard as people often consider them to be. I’m convinced that any programmer can master the art of problem solving and algorithms if he or she has the motivation to succeed. In fact, I believe that most of the algorithms can be very easy to understand if they are explained in a clear and simple way.

Considering that I know how hard can the beginning be, because I have been in the same situation once, I have invested my knowledge and experience into this course, to help you guys making the first steps towards mastering algorithms and bringing you one step closer to your dream job.

HOW IS THIS COURSE STRUCTURED?

Section 1: Introduction

In this section, I will introduce you with the material and the structure of the course.

Section 2: Algorithm Analysis

In section 2, we are going to talk about algorithm analysis. For some of you, this will be your first step into the world of algorithms and you will understand why is this such an important topic.

We are going to learn several things:

First, we will learn about the importance of analysis, and why do we have to analyze our solutions.

Then we are going to focus on Asymptotic notation, which is basically a language that allows us to analyze program running time by identifying its behavior as the input size for the algorithm increases.

After that we will focus on a specific type of notation, called Big-O notation, and we will use the Big-O notation to compare algorithms.

Finally we are going to practice these concepts by calculating time and space complexity of some given algorithms.

Section 3: Sorting

Sorting is one of the most common algorithms in the world, if you look all around you can find a lot of applications that are using a sorting algorithm to put elements of some list in a certain order. The elements don’t have to be numbers, they can be strings or maybe some events which are sorted by date.

In this section we will learn several sorting algorithms:

- Bubble Sort
- Selection Sort
- Insertion Sort
- Merge Sort
- Quick Sort
- Counting Sort

For each algorithm we will determine the time and space complexity and compare trade-offs.

At the end of this section you will learn the most important sorting algorithms and you will be able to determine what is the best algorithm to use depending on the type and range of the data which needs to be sorted.

Section 4: Binary Search

This section is dedicated to a fundamental searching algorithm in computer science: binary search.

We start with an explanation about the basic idea of the algorithm and its implementation.

Then we are going to explore some variations of binary search and how we can implement them:

- Finding the first occurrence of a target value in the input arra
- Finding the last occurrence of a target value in the input array
- Finding the number of occurrences of a target value in the input array

Section 5: BONUS: Interview Problems

This section is a special bonus section, here I will post detailed interview problems solutions. I encourage you to post some interesting problems in the discussions, and each one-two weeks I will choose new problems and post a new video in this section where we solve those new problems.

I also encourage you to post questions about problems that you don't know how to solve or if you have some bugs in your code and you're not sure why you program isn't working

**Also See : LeetCode Coding Interview Question + Solution + Explanation**