Choose a session you can repeat
A useful practice routine starts with a realistic session, not an ambitious problem count. Choose a time window that fits around work, study, and rest. Thirty focused minutes can be a workable starting point, but the right length is the one you can return to without treating every session as a major event.
Give that time a specific job: understand one problem, try an approach, and review what happened. Finishing is useful, but so is identifying exactly why an attempt stalled. A session that produces a clear lesson gives your next session a better starting point.
Attempt the problem before reading the answer
Start by restating the inputs, outputs, and constraints. Walk through one ordinary example and one boundary case. Then describe a simple solution before choosing a more efficient one. This gives you something concrete to test and explain, even if the first approach is too slow for the largest input.
When you get stuck, name the gap before opening a hint. Are you missing a useful data structure, struggling to maintain an invariant, or unsure how to translate the idea into code? Use enough help to address that gap, then continue the attempt yourself. Reading a complete solution too early makes it harder to tell what you could reconstruct unaided.
Finish with a short review
After the attempt, write down the central idea, the edge case you missed, and one thing to try next. Avoid copying the whole solution into your notes. A sentence such as ‘the window must contain no repeated characters after each update’ is more useful for a future attempt than a long code listing without an explanation.
If your code failed, keep the smallest input that exposes the mistake. Explain what your implementation did and what it should have done. That example turns a vague feeling of difficulty into a specific behavior you can check the next time you use the same technique.
Revisit before increasing the volume
Schedule a later attempt at a problem you needed help with. Close your previous answer and recover the reasoning from the prompt. If you can explain the approach, implement it, and test its boundaries, try a related problem and compare what changes.
Review your routine periodically. Keep the parts that help you notice mistakes and recover ideas; simplify the parts you keep postponing. The goal is a practice loop that guides your next decision, not a growing spreadsheet that takes more effort to maintain than the work it describes.