Part 1 of Stanford University's Coursera course on Algorithms Design and Analysis