Explore - LeetCode
Explore - LeetCode
Explore - LeetCode
leetcode.com/explore/interview/card/cheatsheets/720/resources/4725
Cheatsheets
This article will be a collection of cheat sheets that you can use as you solve problems
and prepare for interviews. You will find:
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 1/12
3/17/23, 9:49 PM Explore - LeetCode
First, let's talk about the time complexity of common operations, split by data
structure/algorithm. Then, we'll talk about reasonable complexities given input
sizes.
Given n = arr.length ,
Strings (immutable)
Given n = s.length ,
Linked Lists
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 2/12
3/17/23, 9:49 PM Explore - LeetCode
Hash table/dictionary
Given n = dic.length ,
Note: the 𝑂 ( 1 ) O(1) operations are constant relative to n . In reality, the hashing
algorithm might be expensive. For example, if your keys are strings, then it will cost
𝑂 ( 𝑚 ) O(m) where 𝑚m is the length of the string. The operations only take constant
time relative to the size of the hash map.
Set
Given n = set.length ,
Stack
Given n = stack.length ,
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 3/12
3/17/23, 9:49 PM Explore - LeetCode
Queue
Given n = queue.length ,
Most algorithms will run in 𝑂 ( 𝑛 ⋅ 𝑘 ) O(n⋅k) time, where 𝑘k is the work done at
each node, usually 𝑂 ( 1 ) O(1). This is just a general rule and not always the case.
We are assuming here that BFS is implemented with an efficient queue.
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 4/12
3/17/23, 9:49 PM Explore - LeetCode
The average case is when the tree is well balanced - each depth is close to full. The
worst case is when the tree is just a straight line.
Heap/Priority Queue
Binary search
Binary search runs in 𝑂 ( log 𝑛 ) O(logn) in the worst case, where 𝑛n is the size of
your initial search space.
Miscellaneous
Sorting: 𝑂 ( 𝑛 ⋅ log 𝑛 ) O(n⋅logn), where 𝑛n is the size of the data being sorted
DFS and BFS on a graph: 𝑂 ( 𝑛 ⋅ 𝑘 + 𝑒 ) O(n⋅k+e), where 𝑛n is the number of
nodes, 𝑒e is the number of edges, if each node is handled in 𝑂 ( 1 ) O(1) other
than iterating over edges
DFS and BFS space complexity: typically 𝑂 ( 𝑛 ) O(n), but if it's in a graph,
might be 𝑂 ( 𝑛 + 𝑒 ) O(n+e) to store the graph
Dynamic programming time complexity: 𝑂 ( 𝑛 ⋅ 𝑘 ) O(n⋅k), where 𝑛n is the
number of states and 𝑘k is the work done at each state
Dynamic programming space complexity: 𝑂 ( 𝑛 ) O(n), where 𝑛n is the number
of states
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 5/12
3/17/23, 9:49 PM Explore - LeetCode
the constraints of a problem in an interview, but it's still good for practicing on
LeetCode and completing OAs. Still, in an interview, it usually doesn't hurt to ask
about the expected input sizes.
n <= 10
The expected time complexity likely has a factorial or an exponential with a base
2 𝑛
larger than 2 - 𝑂 ( 𝑛 ⋅ 𝑛 ! ) O(n2⋅n!) or 𝑂 ( 4 ) O(4n) for example.
10 < n <= 20
𝑛
The expected time complexity likely involves 𝑂 ( 2 ) O(2n). Any higher base or a
20 𝑛
factorial will be too slow (3 320 = ~3.5 billion, and 20 ! 20! is much larger). A 2 2n
usually implies that given a collection of elements, you are considering all
subsets/subsequences - for each element, there are two choices: take it or don't take
it.
Again, this bound is very small, so most algorithms that are correct will probably be
fast enough. Consider backtracking and recursion.
At this point, exponentials will be too slow. The upper bound will likely involve
3
𝑂 ( 𝑛 ) O(n3).
Problems marked as "easy" on LeetCode usually have this bound, which can be
deceiving. There may be solutions that run in 𝑂 ( 𝑛 ) O(n), but the small bound
allows brute force solutions to pass (finding the linear time solution might not be
considered as "easy").
Consider brute force solutions that involve nested loops. If you come up with a brute
force solution, try analyzing the algorithm to find what steps are "slow", and try to
improve on those steps using tools like hash maps or heaps.
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 6/12
3/17/23, 9:49 PM Explore - LeetCode
Similar to the previous range, you should consider nested loops. The difference with
2
this range and the previous one is that 𝑂 ( 𝑛 ) O(n2) is usually the
expected/optimal time complexity in this range, and it might not be possible to
improve.
In this range, ask yourself if sorting the input or using a heap can be helpful. If not,
2
then aim for an 𝑂 ( 𝑛 ) O(n) algorithm. Nested loops that run in 𝑂 ( 𝑛 ) O(n2) are
unacceptable - you will probably need to make use of a technique learned in this
course to simulate a nested loop's behavior in 𝑂 ( 1 ) O(1) or 𝑂 ( log 𝑛 ) O(logn):
Hash map
A two pointers implementation like sliding window
Monotonic stack
Binary search
Heap
A combination of any of the above
If you have an 𝑂 ( 𝑛 ) O(n) algorithm, the constant factor can be reasonably large
(around 40). One common theme for string problems involves looping over the
characters of the alphabet at each iteration resulting in a time complexity of
𝑂 ( 26𝑛 ) O(26n).
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 7/12
3/17/23, 9:49 PM Explore - LeetCode
way.
1,000,000 < n
9
With huge inputs, typically in the range of 10 109 or more, the most common
acceptable time complexity will be logarithmic 𝑂 ( log 𝑛 ) O(logn) or constant
𝑂 ( 1 ) O(1). In these problems, you must either significantly reduce your search
space at each iteration (usually binary search) or use clever tricks to find
information in constant time (like with math or a clever use of hash maps).
Sorting algorithms
All major programming languages have a built in method for sorting. It is usually
correct to assume and say sorting costs 𝑂 ( 𝑛 ⋅ log 𝑛 ) O(n⋅logn), where 𝑛n is the
number of elements being sorted. For completeness, here is a chart that lists many
common sorting algorithms and their completeness. The algorithm implemented by
a programming language varies; for example, Python uses Timsort but in C++, the
specific algorithm is not mandated and varies.
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 8/12
3/17/23, 9:49 PM Explore - LeetCode
Definition of a stable sort from Wikipedia: "Stable sorting algorithms maintain the
relative order of records with equal keys (i.e. values). That is, a sorting algorithm is stable
if whenever there are two records R and S with the same key and with R appearing before
S in the original list, R will appear before S in the sorted list."
Here's a flowchart that can help you figure out which data structure or algorithm
should be used. Note that this flowchart is very general as it would be impossible to
cover every single scenario.
Note that this flowchart only covers methods taught in LICC, and as such more advanced
algorithms like Dijkstra's is excluded.
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 9/12
3/17/23, 9:49 PM Explore - LeetCode
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 10/12
3/17/23, 9:49 PM Explore - LeetCode
The following will be a summary of the "Stages of an interview" article. If you have a
remote interview, you can print this condensed version and keep it in front of you
during the interview.
Stage 1: Introductions
Paraphrase the problem back to the interviewer after they have read it to you.
Ask clarifying questions about the input such as the expected input size, edge
cases, and invalid inputs.
Quickly walk through an example test case to confirm you understand the
problem.
Stage 4: Implementation
Explain your decision making as you implement. When you declare things like
sets, explain what the purpose is.
Write clean code that conforms to your programming language's conventions.
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 11/12
3/17/23, 9:49 PM Explore - LeetCode
Avoid writing duplicate code - use a helper function or for loop if you are
writing similar code multiple times.
If you are stuck, don't panic - communicate your concerns with your
interviewer.
Don't be scared to start with a brute force solution (while acknowledging that it
is brute force), then improving it by optimizing the "slow" parts.
Keep thinking out loud and talk with your interviewer. It makes it easier for
them to give you hints.
When walking through test cases, keep track of the variables by writing at the
bottom of the file, and continuously update them. Condense trivial parts like
creating a prefix sum to save time.
If there are errors and the environment supports running code, put print
statements in your algorithm and walk through a small test case, comparing the
expected value of variables and the actual values.
Be vocal and keep talking with your interviewer if you run into any problems.
Stage 7: Outro
https://leetcode.com/explore/interview/card/cheatsheets/720/resources/4725/ 12/12