Hi Joe,
Yes and yes
One motivational tool in the book is that I solve each example in several different ways, each solution better/more efficient than the last. I do that instead of just starting with the best solution straight away, so that we can go on a journey from problem to first attempt to second attempt to ultimate solution. I hope this approach helps readers appreciate what these algorithms/data structures are helping them doo.
For example, in the Dynamic Programming chapter, we start by trying to solve an example without using Dynamic Programming, instead just using recursion. Spoiler: it doesn't work... recursion is not fast enough for these problems. But now we're in a position to understand why recursion isn't efficient enough, and why Dynamic Programming is so powerful.
We use this same approach to motivate data structures, too. For example, in one chapter, we solve a problem that requires us to find the minimum value in an array that keeps being updated. We can try solving it without the proper data structure, but that ends up being too slow. Now we're ready for heaps.
I use big O notation sometimes in the book, but for readers not familiar with it I included a big O crash course in an appendix.
Thank you,
Dan