118. Pascal’s Triangle
Date: 2026-03-16 Difficulty: Easy Topics: Array, Dynamic Programming, Recursion Link: https://leetcode.com/problems/pascals-triangle/
Final Solution
Iterative
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
result = [[1]]
for i in range(1, numRows):
row_arr = []
prev_arr = result[i-1]
for j in range(0, i+1):
if j == 0 or j == i:
row_arr.append(1)
else:
row_arr.append(prev_arr[j] + prev_arr[j-1])
result.append(row_arr)
return resultRecursive
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
if numRows == 1:
return [[1]]
prevRows = self.generate(numRows - 1)
newRow = [1] * numRows
for i in range(1, numRows - 1):
newRow[i] = prevRows[-1][i - 1] + prevRows[-1][i]
prevRows.append(newRow)
return prevRowsInitial Issues
- Mixed up the middle element formula: used
prev[j] + prev[j+1]instead ofprev[j-1] + prev[j] - Included unnecessary
numRows == 0base case in recursive version —generate(1)never callsgenerate(0)
Key Learnings
- Each row starts and ends with
1, middle elements are sum of two adjacent elements from previous row:prev[j-1] + prev[j] prevRows[-1]accesses the last element of a list (negative indexing in Python)- Recursive approach: recurse down to base case
numRows == 1, then build each row on the way back up — same “bucket brigade” pattern as BST search and reverse linked list
Nuances to Remember
- Row
ihasi+1elements (row 0 has 1, row 1 has 2, etc.) - Inner loop range is
range(1, numRows - 1)to skip first and last elements (always 1) numRows == 0base case is dead code — only neednumRows == 1- Recursive call stack trace for
generate(3):generate(3)→ callsgenerate(2), waitsgenerate(2)→ callsgenerate(1), waitsgenerate(1)→ returns[[1]]- Unwind:
generate(2)builds[1,1], returns[[1],[1,1]] - Unwind:
generate(3)builds[1,2,1], returns[[1],[1,1],[1,2,1]]