deeply understanding 1 problem per day is better than reading the solutions of a dozen. Solving leetcode via induction could prove valuable, solve a simple case of n = 1, then try to solve n = 2 do you see a pattern? try to solve n = 3 etc... Don't assume anything, don't categorize problems before thinking of patterns, sometimes dp problems are simple greedy problems, don't go into problem solving with bias. Look to build raw problem solving ability more than remembering problems of a certain flavor. understand advantages of linked list vs arrays, understand dictionaries, understand dfs vs bfs (both traverse graphs but what property does bfs have over dfs?), understand heaps, understand general recursion flow for binary trees,
theres no book, and theres no easy way to get good at that stuff, just have to practice problems and learn about better ways of solving problems via new algorithms and data structures you did not know about.