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.