Growing up, one of my distinct memories was mom doing crossword puzzles while drinking coffee every morning.
This is how I've been treating LeetCode.
Last year, there was a 4 month period where I studied data structures and algorithms while practicing with LeetCode problems in preparation for job interviews. It was exhausting at first, but at some point I was spending half the day working on these things and kind of enjoying it.
Then I got a job and stopped doing them.
It's a year later now and I'm retraining to write Solidity and build different architectures. No job interviews in sight but for some reason I have an itch to scratch with dynamic programming.
Of the fundamental problem solving techniques in computer science, it's the most difficult to understand and use intuitively. Except for graph problems. Those are harder.
I'm finding myself working a new dynamic programming problem for about 30 minutes to an hour per day. And focusing on the same problem for 2-3 days at a time.
It takes a while to really understand why a solution works and use the learnings to build your intuition so that you can solve the next problem faster.
The first time I tried to learn dynamic programming, I rushed it, and it didn't really work. I learned recognize solutions to some problems like Levenshtein Distance, but didn't really understand how to derive it or how to use the concepts to solve other problems.
Now that I've slowed down and started solving these problems for less goal directed reasons, I'm finding it easier to make progress in understanding the core concepts and getting transferable value out of each problem I solve.
Not sure who needs to hear this, but some of these concepts are so difficult that you have to approach them curiously and take quite a bit of time to let yourself understand instead of forcing the understanding.