Eu comecei a praticar no Code Wars e no Leet Code e senti uma boa melhora na minha lógica.

O ideal é ir praticando com problemas que você consegue resolver e ir aumentando a dificuldade aos poucos para não ficar se frustrando com um problema difíceis demais.

O que me ajuda bastante é pensar no problema em termos concretos o fluxo do programa, a partir do momento que ele recebe um input até ele retornar o resultado, e como ele vai sendo transformado. Ajuda bastante usar papel e caneta ao invés de só ficar na sua cabeça.

Para problemas difíceis, ajuda a estratégia do "dividir para conquistar". Dividir o problema em diversas partes e resolver cada parte de uma vez, mesmo que você ainda não saiba o que fazer com as partes restantes. Isso evita que você trave, tentando lidar com mais informação do que você consegue processar.

Pra complementar a sua dica, recomendo também o beecrowd (antigo URI Online Judge), ele tem vários exercícios de cada linguagem e tem opção em PORTUGUêS!