Common problem solving techniques

  • Divide and conquer  : Divide the problem into two or more smaller independent subproblems and solve the original problem using solutions to the subproblems.
  • Recursion, Dynamic programming : If you have access to solutions for smaller instances of a given problem, can you construct a solution to the bigger problem?
  • Case analysis : Can you split the input/execution into a number of cases and solve each case in isolation?
  • Generalization : Is there a problem that subsumes your problem and is easier to solve?
  • Data-structures : Is there a data-structure that directly maps to the given problem?
  • Iterative refinement : Most problems can be solved using a brute-force approach. Can you formalize such a solution and improve upon it.
  • Small examples : Can you find a solution to small concrete instances of the problem and then build a solution that can be generalized to arbitrary instances?
  • Reduction : Can you use a problem with a known solution as a subroutine?
  • Graph modeling : Can you describe your problem using a graph and solve it using an existing algorithm?
  • Auxiliary elements : Can you add some new element to your problem to get closer to a solution?
  • Variation : Can you solve a slightly different problem and map its solution to your problem?
  • Caching : Can you store some of your computation and look it up later to save work?
  • Symmetry Is there symmetry in the input space or solution space that can be exploited.