A major disadvantage of inheritance is not being able to follow the program flow by ctrl + clicking function calls due to some functionality being implemented in ancestor classes. Therefore, I prefer composition over inheritance whenever possible. The one case where inheritance shines is reusing workflows. Let's say all your child classes have a run() method that calls f1(), f2() and f2() in order, where f1, f2, f3 functions are implemented in child classes. If we move the run() method to the ancestor class, child classes would just call that run method, saving you from duplicating the f1, f2, f3 calls in each child.
Friday, September 16, 2022
Monday, September 5, 2022
Studying Algorithms and Data Structures Effectively
There are many ways to solve programming problems. The ideal solution is the one running the fastest and consuming the least amount of memory. The field of algorithms and data structures equips you with the tools to find the best solution. A good solution might run a million times faster than a naive/brute force solution, which might be the difference between a successful and failed project. It has similarities to mathematics because mathematics always tries to find more concise formulae. For example you can find the sum of consecutive integers from 1 to n by summing each number one by one which has a time complexity of O(n). Or you could think a little more about the problem and observe that there are n/2 pairs of the value of n+1, yielding the famous Gauss formula of n/2*(n+1), which has a time complexity of O(1), i.e. the brute force method gets slower and slower as n increases while the formula always runs at constant time! See a similar Codility problem. A good solution is also environmentally friendly since it consumes less energy.
ARRAYS & HASHING
TWO POINTERS
SLIDING WINDOW
STACK
BINARY SEARCH
LINKED LIST
TREES
HEAP / PRIORITY QUEUE
GRAPHS
When studying algorithms and data structures, besides course material, I recommend solving the relevant leetcode questions. Start with the easy ones but note that if this is your first attempt at solving "easy" questions, they won't be easy at all, watch this video for a general approach. Don't just focus on the answer, analyze your solution process even after your solution passes all tests so that it really sinks in.
The good news is that once you solve easy questions, medium ones are not that difficult. The website NeetCode organizes problems nicely according to data structure type and difficulty, I personally use the NeetCode 150 group (see my notes). Python is a concise language to solve coding problems, this 26 minute video teaches you enough python for that. After you finish 29 easy questions on NeetCode 150, move to medium questions, and finally solve the hard ones. It will probably take a couple of months to solve all 150 questions. Besides strengthening you algorithms and data structures foundation, you also will have practiced for coding interviews.
If you want to practice more in a specific area, you can use chatGPT to generate additional questions/problems, e.g. "generate a medium level coding question related to trie data structure"
Visualizing algorithms: Visualgo
05.10.2025: For junior roles, consider this smaller set of 49 questions curated by Aman Manazir, designed to be completed in 8 weeks:
ARRAYS & HASHING
01 | Easy | Contains Duplicate |
02 | Easy | Valid Anagram |
03 | Easy | Two Sum |
04 | Medium | Group Anagrams |
05 | Medium | Top K Frequent Elements |
06 | Medium | Valid Sudoku |
07 | Medium | Product of Array Except Self |
08 | Medium | Longest Consecutive Sequence |
TWO POINTERS
09 | Easy | Valid Palindrome |
10 | Medium | Two Sum II Input Array Is Sorted |
11 | Medium | 3Sum |
12 | Medium | Container With Most Water |
SLIDING WINDOW
13 | Easy | Best Time to Buy And Sell Stock |
14 | Medium | Longest Substring Without Repeating Characters |
15 | Medium | Longest Repeating Character Replacement |
STACK
16 | Easy | Valid Parentheses |
17 | Medium | Min Stack |
18 | Medium | Daily Temperatures |
BINARY SEARCH
19 | Easy | Binary Search |
20 | Medium | Find Minimum In Rotated Sorted Array |
21 | Medium | Search In Rotated Sorted Array |
LINKED LIST
22 | Easy | Reverse Linked List |
23 | Easy | Merge Two Sorted Lists |
24 | Medium | Reorder List |
25 | Medium | Remove Nth Node From End of List |
26 | Easy | Linked List Cycle |
27 | Medium | LRU Cache |
TREES
28 | Easy | Invert Binary Tree |
29 | Easy | Maximum Depth of Binary Tree |
30 | Easy | Diameter of Binary Tree |
31 | Easy | Balanced Binary Tree |
32 | Easy | Same Tree |
33 | Easy | Subtree of Another Tree |
34 | Medium | Lowest Common Ancestor of a Binary Search Tree |
35 | Medium | Binary Tree Level Order Traversal |
36 | Medium | Binary Tree Right Side View |
37 | Medium | Count Good Nodes In Binary Tree |
38 | Medium | Validate Binary Search Tree |
39 | Medium | Kth Smallest Element In a Bst |
HEAP / PRIORITY QUEUE
40 | Easy | Kth Largest Element In a Stream |
41 | Easy | Last Stone Weight |
42 | Medium | Kth Largest Element In An Array |
GRAPHS
43 | Medium | Number of Islands |
44 | Medium | Max Area of Island |
45 | Medium | Clone Graph |
46 | Medium | Pacific Atlantic Water Flow |
47 | Medium | Surrounded Regions |
48 | Medium | Course Schedule |
49 | Medium | Course Schedule II |
Subscribe to:
Posts (Atom)