Problems of the day
1. Decode Ways

class Solution:
def numDecodings(self, s: str) -> int:
n = len(s)
# Base case
if n > 0 and s[0] == '0':
return 0
# Init n + 1 items
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
for i in range(2, n + 1):
one_digit = s[i - 1]
two_digit = s[i - 2:i]
if 1 <= int(one_digit) <= 9:
dp[i] += dp[i - 1]
if 10 <= int(two_digit) <= 26:
dp[i] += dp[i - 2]
return dp[n]

2. 2D Prefix Matrix

3. Rotate Matrix
-
Run from the bottom of the column to row
-
Continue in another column

4. Min Cost Climbing Stairs
-
DP theo cost(i - 1), and cost(i - 2) + cost[i]
-
Top down: cost[i] + min(dfs(i + 1), dfs(i + 2))
-
Backward: for i in range(len(cost) - 3, -1, -1) => cost[i] += min(cost[i + 1], cost[i + 2])
-
Bottom-up: dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])

5. Sort an Array
-
Heap Sort
-
Merge Sort
-
Quick Sort
6. Word Ladder
-
Idea: BFS.
-
Time Complexity: O(N^2 x M (list))

7. Delete Node in a BST

8. Minimum Interval to Include Each Query
- Sort by length interval.

9. Partition Labels

10. Combination Sum 2


11. Climb Stairs


12. Design Twitter

13. Construct tree from preorder and inorder


14. Is Valid BST

15. Construct tree from preorder and postorder

16. Lowest Common Ancestor in Binary Search Tree

class Solution:
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if not root or not p or not q:
return None
if (max(p.val, q.val) < root.val):
return self.lowestCommonAncestor(root.left, p, q)
elif (min(p.val, q.val) > root.val):
return self.lowestCommonAncestor(root.right, p, q)
else:
return root
17. Unique Binary Search Trees
Note: dp[4] = dp[3] x dp[0] + dp[2] x dp[1] + dp[1] x dp[2] + dp[0] x dp[3]
18. Unique Binary Search Trees 2
Idea: Accumulate result of all tree in res

Last Updated On July 28, 2025