I teach students to develop a deep understanding of the material, and a true appreciation of what they are learning. I believe in pursuing these as the primary goal, and I discourage any learning based on simple "pattern matching".
After achieving a deep understanding, it's simply practice, practice, practice. With the solid theory under your belt, repeated exposure to different problems from different angles allows you to build intuition and hone in on creative problem-solving skills.
CS 109: Probability for Computer Scientists
CS 61A: The Structure and Interpretation of Computer Programs
CS 70: Discrete Mathematics and Probability Theory
I offer private tutoring over the school year, as well as summers. Click here for more information.