We may earn an affiliate commission when you visit our partners.
Take this course
Blanca Huergo

Ready to take your programming skills to the next level? In this course, which will help both novice and advanced programmers alike, you will dominate the algorithms and data structures necessary to do well in contests and to gain a competitive edge over other candidates in software interviews.

Read more

Ready to take your programming skills to the next level? In this course, which will help both novice and advanced programmers alike, you will dominate the algorithms and data structures necessary to do well in contests and to gain a competitive edge over other candidates in software interviews.

There are many tricks which are gained through experience and competitive programmers have a sixth sense when it comes to breaking problems down into the building blocks that make up a solution and which many are reluctant to share. Here I will let you in on the techniques and the applications that are useful for the field, focusing on real problems and how they are solved, while giving you an intuition on what is going on under the hood and why these ideas work.

From dynamic programming to graph algorithms and backtracking, you will get to practise and feel confident about many topics, learning advanced concepts such as union-find disjoint sets, tries and game theory without feeling lost, and to apply new content as soon as you learn it, with over 100 suggested problems, both from past olympiads and online judges and some created by me specifically for this course. All of them come with detailed solutions. With this course, you will be ready to participate in online contests and informatics olympiads, and will have the experience necessary to continue advancing in this field. Are you ready to take this big step in your journey?

Enroll now

What's inside

Learning objectives

  • Competitive programming
  • Algorithms
  • Data structures
  • Programming
  • Merge sort, quicksort, count sort, bucket sort
  • Linear search, binary search, quickselect, two pointer technique
  • Stacks, queues, hash tables, hash sets, heap-based structures, binary search tree-based data structures, coordinate compression, custom comparators
  • Hash functions, collisions, rabin-karp, sliding window technique
  • Greedy algorithms
  • Iterative complete search, backtracking, permutations, subsets, pruning
  • Divide and conquer, binary search the answer, the bisection method
  • Dynamic programming: competitive approach, top-down and bottom-up dp, space optimisation, prefix sums, backtracking to find solutions
  • Graph representation: adjacency lists, adjacency matrices, edge lists, weighted and unweighted graphs
  • Graph exploration: breadth-first search (bfs), depth-first search (dfs), connected components, multi-source bfs
  • Directed graphs and cycles: topological sort, strongly connected components, bfs for single-source shortest paths
  • Shortest paths: dijkstra, floyd-warshall's, bellman-ford and negative-weight cycles, arbitrages and the logarithm trick
  • Trees: special properties, faster shortest paths, diameter, minimum spanning trees
  • Union-find disjoint sets: optimised implementation, kruskal's algorithm, minimum spanning tree variants
  • Strings: dynamic programming on strings, longest common subsequence, edit distance, longest palindromic substring, tries, suffix tries
  • Game theory: states and transitions, minimax for optimal game playing, dynamic programming to recover optimal strategies
  • Approaching interactive problems
  • Show more
  • Show less

Syllabus

Introduction
About the Instructor
Course Prerequisites
Course Structure
Read more

Traffic lights

Read about what's good
what should give you pause
and possible dealbreakers
Covers dynamic programming and graph algorithms, which are essential for excelling in programming contests and technical interviews
Explores advanced concepts like union-find disjoint sets, tries, and game theory, providing a comprehensive toolkit for competitive programming
Includes over 100 suggested problems from past olympiads and online judges, offering ample practice and application of learned concepts
Teaches sorting algorithms in C++ using custom comparators, structs, and overloading comparison operators, which may require familiarity with C++
Requires familiarity with data structures such as stacks, queues, and hash tables, which may necessitate prior coursework or self-study

Save this course

Create your own learning path. Save this course to your list so you can find it easily later.
Save

Reviews summary

Comprehensive algorithms for competitive programming

According to learners, this course offers a comprehensive coverage of algorithms and data structures highly relevant for competitive programming and technical interviews. Many students find the large number of practice problems and their detailed solutions to be particularly valuable for building problem-solving skills. While generally praised for its logical structure, some reviewers noted that the pace can feel quite fast, especially during sections on complex topics like DP and Graphs, suggesting it might be less suitable for absolute beginners without prior algorithmic exposure. Overall, it's considered a highly valuable resource for those with some programming background aiming to significantly improve their algorithmic abilities.
Content builds logically, easy to follow progression.
"The structure is logical."
"The course structure builds up logically..."
Covers essential algorithms for contests/interviews.
"This course is exactly what I needed to prepare for coding interviews. It covers all the essential algorithms and data structures in depth."
"A very solid introduction to competitive programming concepts. The range of topics is impressive, from basic sorts to dynamic programming and graphs."
"I feel it covers the key concepts needed for competitive programming."
"It helped me land a better job by improving my technical interview performance."
"I found it covered topics extensively."
High-quality practice problems are key.
"The problems are well-chosen and challenging, providing excellent practice."
"The problem sets are the strongest part - they really force me to apply what I learn."
"The problem sets are crucial for learning by doing, and the detailed solutions are a lifesaver."
"The number and quality of practice problems are unmatched."
"The sheer volume of practice problems with solutions is incredible."
Can be fast-paced; better with prior knowledge.
"The course covers a lot of ground, but it assumes a certain level of prior knowledge. As a beginner, I found some sections quite challenging to follow..."
"I struggled with this course. The explanations were often too fast-paced, and I felt lost quickly..."
"I think it might be better for those with more experience."
"Some explanations felt a bit rushed, especially for the more complex graph algorithms..."
"I noticed the pace picks up significantly towards the end."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Competitive Programming with these activities:
Review Data Structures and Algorithms Fundamentals
Strengthen your understanding of fundamental data structures and algorithms. This will provide a solid base for the more advanced topics covered in the course.
Show steps
  • Review basic data structures like arrays, linked lists, stacks, and queues.
  • Practice implementing common sorting algorithms such as bubble sort, insertion sort, and merge sort.
  • Solve introductory problems on platforms like HackerRank or LeetCode.
Practice Sorting Algorithms
Reinforce your understanding of sorting algorithms. This will help you quickly implement and adapt them in competitive programming problems.
Show steps
  • Implement various sorting algorithms from scratch (e.g., merge sort, quicksort, count sort).
  • Solve sorting-related problems on online judges like Codeforces or AtCoder.
  • Analyze the time and space complexity of each sorting algorithm.
Build a Competitive Programming Template
Create a reusable code template to speed up your problem-solving process. This will save you time during contests and allow you to focus on the problem logic.
Show steps
  • Include commonly used data structures and algorithms in your template.
  • Add preprocessor directives and macros for frequently used operations.
  • Implement input/output functions for different data types.
  • Test your template on various problems to ensure its correctness and efficiency.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Create a Cheat Sheet of Common Algorithms and Data Structures
Compile a cheat sheet of essential algorithms and data structures. This will serve as a quick reference guide during contests and practice sessions.
Show steps
  • Summarize the key concepts and properties of each algorithm and data structure.
  • Include code snippets and examples for common operations.
  • Organize the cheat sheet in a logical and easy-to-navigate manner.
Solve Problems by Topic
Target specific areas where you need improvement. This will help you build expertise in different problem-solving techniques.
Show steps
  • Choose a topic (e.g., dynamic programming, graph algorithms, string manipulation).
  • Find a set of problems related to that topic on online judges.
  • Solve the problems and analyze your solutions.
Participate in Virtual Contests
Simulate the contest environment to improve your speed and accuracy. This will help you get comfortable with the pressure of competitive programming.
Show steps
  • Choose a virtual contest on platforms like Codeforces or AtCoder.
  • Solve the problems within the given time limit.
  • Analyze your performance and identify areas for improvement.
Review 'Introduction to Algorithms' by Cormen et al.
Deepen your understanding of algorithms and data structures. This book provides a comprehensive and rigorous treatment of the subject.
Show steps
  • Read relevant chapters on algorithms and data structures covered in the course.
  • Work through the examples and exercises in the book.
  • Compare the book's explanations with the course materials.

Career center

Learners who complete Competitive Programming will develop knowledge and skills that may be useful to these careers:
Competitive Programmer
A Competitive Programmer participates in programming contests to solve algorithmic puzzles. This course is explicitly designed for Competitive Programmers. The course content directly addresses the skills and knowledge needed to excel in programming competitions. The course includes algorithms, data structures, and problem-solving techniques that are frequently encountered in contests. The numerous practice problems, drawn from past olympiads and online judges, provide invaluable experience in tackling contest problems. The course's focus on real problems and their solutions, combined with an understanding of the underlying principles, helps develop the intuition needed to succeed in competitive programming. For Competitive Programmers, this course is a direct pathway to improving their performance and achieving success in programming contests.
Algorithm Engineer
An Algorithm Engineer focuses on designing and implementing algorithms for various applications. This course is directly relevant to the work of an Algorithm Engineer. The course includes many algorithms and data structures, which are cornerstones of this field. The detailed solutions to numerous problems help develop the analytical and problem-solving abilities essential for Algorithm Engineers. In particular, the sections on dynamic programming, graph algorithms, and game theory are directly applicable to algorithm design. The course content helps advance in this field. The practice problems, drawn from contests and designed specifically for the course, provide hands-on experience that is highly beneficial for anyone working as an Algorithm Engineer.
Artificial Intelligence Programmer
An Artificial Intelligence Programmer develops algorithms and software for artificially intelligent systems. This course is directly relevant to the work of an Artificial Intelligence Programmer. The course includes algorithms and data structures that are fundamental to AI development. The sections on graph algorithms, search algorithms, and game theory are particularly valuable. The course builds a foundation for designing intelligent agents that can solve complex problems. The practice problems, drawn from contests and designed specifically for the course, provide hands-on experience that is highly beneficial for anyone working as an Artificial Intelligence Programmer.
Software Engineer
A Software Engineer designs, develops, and tests software applications. This course, with its focus on algorithms and data structures, is invaluable for anyone aiming to excel as a Software Engineer. The course helps build a foundation in problem-solving, which is crucial in software development. Its coverage of topics such as dynamic programming and graph algorithms may be useful in designing efficient and scalable software solutions. Furthermore, the practice with over 100 problems helps develop the coding skills needed to create high-quality software. For Software Engineers dealing with performance-critical applications, the insights into optimised implementations are invaluable. The course's structured approach to learning advanced concepts helps build confidence and competence in software engineering tasks.
Back-End Developer
A Back End Developer works on the server-side logic and databases that power web applications. This course, with its focus on algorithms and data structures, is invaluable for anyone aiming to excel as a Back End Developer. The course helps build a foundation in problem-solving, which is crucial in designing efficient and scalable server-side systems. Its coverage of topics such as searching, sorting, and hashing may be useful in optimising database queries and data retrieval. Furthermore, the practice with over 100 problems helps develop the coding skills needed to create robust and reliable back end systems. For Back End Developers dealing with high-traffic applications, the insights into optimised implementations are invaluable for performance.
Research Scientist
A Research Scientist conducts research to advance knowledge in a specific field. This course, with its focus on algorithms and data structures, helps build a solid foundation for anyone aiming to excel as a Research Scientist, especially in computer science or related fields. The course helps build a foundation in problem-solving, which is crucial in designing and implementing research experiments. Its coverage of topics such as graph algorithms and dynamic programming may be useful in developing new algorithms and models. The practice with over 100 problems helps develop the coding skills needed to implement and test research ideas. For Research Scientists dealing with computationally intensive problems, the insights into optimised implementations are invaluable.
Machine Learning Engineer
A Machine Learning Engineer develops and deploys machine learning models. This course, with its focus on algorithms and data structures, helps build a solid foundation for anyone aiming to excel as a Machine Learning Engineer. While not directly focused on machine learning techniques, the course can help build a foundation in problem-solving, which is crucial for designing efficient machine learning algorithms. Its coverage of topics such as graph algorithms and dynamic programming may be useful in optimising machine learning models and processing large datasets. The practice with over 100 problems helps develop the coding skills needed to implement machine learning algorithms. For Machine Learning Engineers dealing with large-scale datasets, the insights into optimised implementations are invaluable for performance.
Full-Stack Developer
A Full Stack Developer works on both the front end and back end of web applications. This course, with its focus on algorithms and data structures, is invaluable for anyone aiming to excel as a Full Stack Developer. The course helps build a foundation in problem-solving, which is crucial in designing efficient and scalable web applications. Its coverage of topics such as searching, sorting, and hashing may be useful in optimising data handling on both the front end and back end. Furthermore, the practice with over 100 problems helps develop the coding skills needed to create robust and user-friendly web applications. For Full Stack Developers dealing with complex web applications, the insights into optimised implementations are invaluable for performance.
Data Scientist
A Data Scientist uses statistical methods and algorithms to extract knowledge and insights from data. This course may be useful for a Data Scientist because it covers fundamental algorithms and data structures needed to process and analyse data effectively. The sections on searching, sorting, and hashing are directly relevant to data manipulation. The exposure to dynamic programming and graph algorithms may be useful in building predictive models and analysing complex datasets. The problem-solving skills honed through the course, with its numerous practice problems, are invaluable for a Data Scientist tasked with extracting meaningful insights from data. The course facilitates the efficient processing and analysis needed to succeed as a Data Scientist.
Game Developer
A Game Developer creates video games for computers, consoles, and mobile devices. This course may be useful for a Game Developer because it covers algorithms and data structures that are fundamental to game development. The sections on graph algorithms, dynamic programming, and game theory are particularly relevant to designing game AI, pathfinding, and game mechanics. The problem-solving skills honed through the course, with its numerous practice problems, are invaluable for a Game Developer tasked with optimising game performance and creating engaging gameplay. Game Developers can use the course to craft efficient and enjoyable gaming experiences.
Data Engineer
A Data Engineer builds and maintains the infrastructure that enables data storage, processing, and analysis. This course may be useful for a Data Engineer because it covers fundamental algorithms and data structures that are essential for efficient data management. The sections on hashing, searching, and sorting are directly relevant to data indexing and retrieval. The exposure to dynamic programming may be helpful in optimising data processing pipelines. The problem-solving skills honed through the course, with its numerous practice problems, are invaluable for a Data Engineer tasked with building scalable and reliable data infrastructure. The course facilitates efficient data handling.
Robotics Engineer
A Robotics Engineer designs, builds, and programs robots for various applications. This course may be useful for a Robotics Engineer. The course includes algorithms and data structures that are essential for robot control and navigation. The sections on graph algorithms and search algorithms are directly applicable to robot path planning and obstacle avoidance. The problem-solving skills honed through the course, with its numerous practice problems, are invaluable for a Robotics Engineer tasked with developing efficient and robust robot control systems. The course can help advance in this field.
Security Engineer
A Security Engineer protects computer systems and networks from cyber threats. This course may be useful for a Security Engineer. The course includes algorithms and data structures that are relevant to security applications. The sections on hashing and string algorithms may be applicable to password security and intrusion detection. The problem-solving skills honed through the course, with its numerous practice problems, are invaluable for a Security Engineer tasked with identifying and mitigating security vulnerabilities. The course provides skills that can be applied creatively to solve complex security problems.
Database Administrator
A Database Administrator manages and maintains databases to ensure data integrity and availability. This course may be useful for a Database Administrator. The course includes algorithms and data structures that are essential for efficient database management. The sections on searching, sorting, and hashing are directly relevant to database indexing and query optimisation. The problem-solving skills honed through the course, with its numerous practice problems, are invaluable for a Database Administrator tasked with ensuring database performance and reliability. The course enhances abilities in the computational tasks involved.
Quantitative Analyst
A Quantitative Analyst, often working in finance, develops and implements mathematical models for pricing and risk management. This course may be helpful for a Quantitative Analyst. While not directly focused on financial modelling, the course's emphasis on algorithms and data structures helps build a foundation in computational problem-solving. The coverage of dynamic programming and graph algorithms may be applicable to optimising financial models and analysing market data. The problem-solving skills honed through the course, with its numerous practice problems, are valuable for Quantitative Analysts tasked with developing efficient and accurate financial models. The course can prepare one for the computational challenges of quantitative finance.

Reading list

We've selected one books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Competitive Programming.
Comprehensive textbook on algorithms and data structures, widely used in computer science education. It covers a broad range of topics relevant to competitive programming, including sorting, searching, graph algorithms, and dynamic programming. It provides rigorous analysis and clear explanations, making it an excellent resource for both beginners and advanced programmers. This book valuable reference for understanding the theoretical foundations of algorithms.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser