Loading
0xC0Lesson 13 of 13

Generate choices with backtracking

Build candidates step by step and undo choices to explore every option.

20 min 5-question quiz 1 code exercise
By the end of this lesson you can
  • Structure a backtracking search: choose, explore, un-choose.
  • Generate subsets, combinations, and permutations.
  • Prune branches that cannot lead to a solution.

Backtracking explores every candidate solution by building it one choice at a time. At each step you choose an option, explore further recursively, then un-choose it to try the next option. It solves “generate all” problems - subsets, combinations, permutations, valid parentheses - and constraint puzzles like N-Queens and Sudoku.

The backtracking template

1def backtrack(path, choices):
2    if path is complete: record a copy of path; return
3    for choice in choices:
4        if choice is invalid: continue   # pruning
5        path.append(choice)              # choose
6        backtrack(path, remaining)       # explore
7        path.pop()                       # un-choose

The output size drives the complexity: there are 2ⁿ subsets and n! permutations, so these algorithms are exponential by nature. Pruning - skipping choices that cannot work - is what keeps them practical.

solution.py
1def subsets(nums):
2    result = []
3    path = []
4
5    def backtrack(start):
6        result.append(path[:])  # record a copy
7        for i in range(start, len(nums)):
8            path.append(nums[i])
9            backtrack(i + 1)
10            path.pop()
11
12    backtrack(0)
13    return result
14
15print(subsets([1, 2, 3]))
Output
[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]

Passing start forward means each element is only chosen after the ones before it, so [1, 2] and [2, 1] are not both generated. Permutations drop that rule and instead track which elements are already used. Recording path[:] (a copy) matters: appending path itself would store the same list object, which ends up empty.

Key takeaways

  • Choose, explore, un-choose.

  • Record copies of the path, not the path itself.

  • Exponential output means exponential time; prune early.

Lesson quiz

5 questions · pass with 4 correct · up to 50 XP

Passing this quiz completes the lesson and keeps your streak going. Questions you miss come back in review sessions later.

Practice: solve interview problems

Solve a classic interview problem in Python and run it against test cases. Aim for the optimal complexity, then check the edge cases. Exercises run locally in your browser.

Exercise 1

Generate combinations

+25 XP

Read n and k. Print every combination of k numbers chosen from 1..n, one per line with numbers separated by spaces, in lexicographic order. Use backtracking.

  • Choose 2 of 4
  • Choose 3 of 3
main.py
Loading editor…

Python runs in a sandboxed browser worker with a 60 second time limit. Its runtime loads from the Pyodide CDN; your code stays in this browser.

Questions about this lesson

Stuck? Ask. Figured something out? Share it. Explaining is one of the best ways to learn.

Loading posts…