# Who Should Take This Course

Learn the basic requirements for taking this course.

## We'll cover the following

Thank you for choosing this course! We hope the techniques you learn in this course go a long way towards building your confidence to tackle tough coding interviews.

As you prepare to land your dream job as a programmer, you may realize that, though you can write code to a given specification, you often get stuck when confronted with an unfamiliar problem. You may be uncertain about which data structures to use, which programming technique suits the problem best, or even have difficulty understanding the problem correctly.

This is a natural part of a programmer’s journey from proficiency in a language to developing more general problem-solving and algorithmic skills. It is critical and hugely rewarding to invest time and effort in developing these skills to ace your coding interview and excel in your new role. This course will help you develop precisely these fundamental skills required for effective problem-solving and programming.

## Lesson structure

Each lesson will lay out a problem that will challenge and expand your ability to understand and propose solutions to commonly encountered problems.

You may try out your solution in any of the six supported programming languages: C++, Java, Python, Javascript, Ruby and Go.

We strongly recommend that you take some time to understand the problem and then attempt to solve it.

If you are short on time, you can simply dive into the provided solution. However, the best way to learn is to jump in yourself. Once you have reviewed the provided solution, we encourage you to tinker with it to understand it better or to help you solve variants of the same problem.

A problem may have multiple correct solutions. How then to choose between them? One important set of criteria is the complexity of the algorithm, specifically, how long the algorithm takes to compute the results and how much space in memory it takes up. Though we do not provide detailed calculations, we do provide the time and space complexity measures of each solution, to help you develop the habit of quantitatively comparing alternative solutions.

Note: The standard way to calculate space complexity does not count the space required either for the algorithm’s input or its output, but only the space required for intermediate steps of the calculation.

For this course, you need to have a basic conceptual understanding of common data structures like arrays, linked lists, trees, hash tables, stacks, queues, heaps, and graphs. Even if you’re just a beginner, solving the challenges in this course will help you develop hands-on skills for implementing and using many of these data structures.

You should also be familiar with recursion and the Big-O notation for complexity calculations.