Doing the problem sets from a good university course.
Some problems might take you hours to solve, but it will develop your stamina for thinking hard.
It requires minimal mathematical background (undergraduate level discrete math). But you will learn a bunch of relevant algorithmic concepts. And the problem sets are hard!