You want to know how to start competitive programming so you can ace
coding interviews from Google, but you don't know how? Or maybe you want to
avoid making common mistakes that beginners make.
This video will be split
into many different parts depending on where you are. There should be a list of
topics with their timestamps to my left.
Make sure that you check out the list of
mistakes at the end.
You might think that the first step would be to learn to
program but that's not exactly the case. If you are going to learn anything
online, you'll need to at least be able to understand English. I think that most
people are fine with this but just keep this in mind if English is not your
native language and you don't have that much experience with it.
The second thing
is math. Yes, you do need math to do CS which might make some of us a bit
uncomfortable; but don't worry, most of it can be learned along the way. You need a
math level equivalent to that of a typical student in the US from grades
8 to 10 and mostly just the algebra and combinatorics, which means you can forget
about geometry, trigonometry, and calculus. You also need to know very basic modular
arithmetic and number theory. CS contains a lot of graph theory, but you don't need
to know about it when you start. If you happen to have experience with math
contests like MathCounts, AMC, or even Olympiads, then you're off to a great start
already and you don't need to worry that much about this. If you feel like you
might need a bit of review on these topics, you can go to the math section on
HackerRank, where you can do problems on number theory, combinatorics, algebra, and
probability. You don't need to finish of all the problems; just make sure that you
know the basics.
The last thing is touch typing. Touch typing is where you type
without looking at your keyboard and it can greatly boost your typing speed.
You basically use the home row position and you memorize where all the keys are. My
typing speed without touch typing is 30 to 40 words per minute while my typing
speed with touch typing is 100 to 130 words per minute. If you don't know what
touch typing is, be sure to learn it, and one website you can use for this is
keybr.com. You don't have to type as fast as I do
but getting to 50 to 60 words per minute would be nice.
Now we're at the second
step, which is learning a programming language. You might have heard that most
top competitive programmers use C++ and that's true. This is because C++ is
sometimes necessary for some of the harder problems as it is one of the
fastest languages. However, if you already know a programming language that is not
too obscure, then don't bother learning C++ yet. I got to red on Codeforces,
which is the Grandmaster rank, by only using Java and I only switched to C++
after that. If you don't have any programming experience, there are several
options for you. If the idea of writing code really scares you, then you can
start out with Scratch, which is a visual programming language. Many kids start out
using Scratch before transitioning to writing real code. I recommend most
people to just start learning C++. There is a nice nine-hour video on the basics
of C++, I'll include the link in the description, and I recommend you to watch
and learn the first five or six hours of that
video. After you finish that, you can continue by practicing the C++ skill on
HackerRank, where there are a bunch of useful problems and you don't need to
finish all of them just make sure that you know the basics.
So, you have now
learned to program and you want to start CP in particular. You'll need to start
learning basic problem-solving, algorithms, and data structures. There are
several resources which you can use for this. The first one is the Competitive
Programmer's Handbook, and the link will be in the description. It contains many
useful concepts and explanations for beginners. The second one is the
algorithms page on GeeksForGeeks. It contains an exhaustive list of articles
of the most common algorithms that you will encounter in CP. If you can't learn
something in the resources above, you can always use Google to find useful
articles on anything that you want to learn. To practice, one good
resource which I've mentioned several times already is HackerRank. They have an
algorithms section, and you can do all subdomains in this section except for
the last two. The problems on HackerRank have good editorials, which are basically
explanations for the problems. A question I get a lot is whether there is any road
map or syllabus for competitive programming. The answer is most people,
including me, don't follow any such roadmap. We just do whatever practice we
can find. However, if you still want an ordered list of problems to practice
from, you can try A2OJ ladders. These ladders contain lists of problems for
people of all levels from beginners to more experienced competitive programmers.
Another list is this spreadsheet, made by Mostafa Saad, and the link will be in
the description. Most of the explanations videos are in
Arabic, but the list of problems is still useful. In addition, contests are fun, and
doing contests is also a form of practice. If you want to test out your
skills, there are a few contests for beginners. The first few problems of
LeetCode weekly contests, the first few problems of AtCoder beginner contests,
and the first few problems of Codeforces division three rounds are ones
that I would suggest for beginners. I will introduce more contests in CP in
more depth in other videos.
The last step is just doing constant practice by doing
problems and contests. I'll go over this in more detail in another video, so you
should definitely subscribe so you'll be notified as soon as that video comes out.
Okay, so let's move on. Wait, what's this step? Making a YouTube channel to flex
your skills... Just ignore this step, it's just stupid, who would ever do this?
The first common mistake is relying on college courses. Although college courses
such as MIT OpenCourseWare do contain good classes to learning algorithms from,
the target of their courses is more for CS research than for CP. Problems that
you practice in courses will not be the same as problems in
CP. The second common mistake is reading too much. Although you do need to learn basic
information for CP, CP is about problem-solving, and reading is not problem-
solving. Reading is passive. When you read, your mind is waiting for the answer to
appear in front of you, but you want to train your mind to be active and not
passive. There's a 5% rule which states that for every 100 minutes you spend on CP
less than 5 minutes of that should be reading, and this number only decreases
as you start to learn most of the basic concepts. The third common mistake kind
of goes along with the last common mistake, as if you read too much, you'll
likely be learning techniques that are too advanced. If I just use the example of
data structures, there are many powerful data structures out there, like hash maps
and segments trees; however, those data structures should
only be used when necessary. In coding interviews, the interviewers are probably
looking for solutions that use simpler techniques. For CP in general, harder
algorithms take more time to implement, make your program slower, and more
complicated programs are more likely to fail. The rule is, if you can't solve most
problems which require easier techniques, then don't bother learning the harder
techniques. The last common mistake is comparing yourself with others. Sometimes,
I receive complaints from people, like, "My friend started CP one month later than I
did, but he's better than me, am I simply too dumb for this?". First of all, he may
actually be practicing more than you are. Maybe he solves problems for 6 hours a
day and you only do it for 3 hours a day. Well, some people will say "I'm sure my
friend and I both solve problems for 3 hours a day!". Even if you are sure that
you guys are doing the same amount of practice, maybe he doesn't listen in
class or maybe he's antisocial and doesn't talk to anyone in class
So anyway, he is thinking of how to solve problems during class and you aren't, so
that's why he's better than you. Even if you say "I know my friend really well, I
stalk him every day in every part of his life, and I'm sure that he doesn't do
any extra form of practice like thinking of problems during class.". Maybe, he has five
years of programming experience already, and you only have a few months, or maybe he
used to do math contests, so his problem-solving skills will definitely
be better than yours. The conclusion is, everyone will improve
just at different rates. Comparing your progress and how much you practice with
others is not productive. CP is like a marathon, not a sprint,
so you might only see improvement after a year of working hard for several hours
per day. Be sure to subscribe to my channel as I'll be posting more
information about improving in competitive programming. You can also
join my Discord server that I just started, and the link is in the
description, where I'll post solutions to various contests and where you can
discuss competitive programming in general with others. And that's it,
thanks for watching!