Friday, September 16, 2022

When is inheritance useful?

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.

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.

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