Conte Subarrays com uma Soma-Alvo
Combine somas de prefixos com um mapa hash.
Conte Subarrays com uma Soma-Alvo é uma aula grátis de Competitive Programming Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Competitive Programming Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Competitive Programming Academy inclui 4 aulas no total.
Uma pergunta mais difícil
Agora vem a reviravolta: conte quantos subvetores somam um alvo k. Verificar todos os pares é lento, mas somas de prefixos com um mapa hash resolvem o problema. 🎯
Reformule com prefixos
A soma de um subvetor é igual a prefix[r + 1] menos prefix[l]. Portanto, uma soma igual a k significa que dois valores de prefixo diferem exatamente em k.
A reorganização fundamental
Se o prefixo atual é P, você precisa de um prefixo anterior igual a P menos k. Essa reorganização é todo o segredo.
need = current_prefix - kConte, não pesquise
Em vez de voltar e percorrer os valores a cada vez, registre quantas vezes cada valor de prefixo apareceu. Uma contagem acumulada responde em O(1).
Use um mapa de frequências
Um dicionário associa cada valor de prefixo ao número de vezes que você o viu. Esse mapa transforma a busca em uma contagem instantânea.
from collections import defaultdict
seen = defaultdict(int)Inicialize o prefixo vazio
Antes do laço, registre que o prefixo 0 apareceu uma vez. Esse valor inicial permite contar subvetores que começam no índice 0.
seen[0] = 1O laço de uma passagem
Para cada elemento, atualize o prefixo acumulado, adicione a contagem do valor necessário e depois registre o prefixo atual. Uma única passagem faz tudo.
total += x
count += seen[total - k]
seen[total] += 1Por que a ordem importa
Você deve adicionar à resposta antes de registrar o prefixo atual. Caso contrário, um intervalo de comprimento zero entra indevidamente e a contagem fica errada.
O ganho de velocidade
Cada elemento exige trabalho constante, então a contagem inteira é executada em O(n). Isso supera a força bruta O(n ao quadrado) para entradas grandes.
Números negativos são aceitos
Ao contrário das janelas deslizantes, este método lida tranquilamente com números negativos, porque as diferenças de prefixos continuam válidas independentemente dos sinais.
Um caso clássico de uso
Este padrão resolve o famoso problema de subvetores cuja soma é igual a k e muitas variações disfarçadas em avaliadores de competições.
Verificação rápida
Seu prefixo acumulado é P e o alvo é k.
Recapitulação
Você pode contar subvetores com a soma desejada em O(n) usando somas de prefixos e um mapa de frequências. Inicialize o prefixo 0 e conte antes de registrar. ✅
Perguntas Frequentes
A aula “Conte Subarrays com uma Soma-Alvo” é grátis?
Sim — o texto completo de “Conte Subarrays com uma Soma-Alvo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Competitive Programming Academy, atualize para CoddyKit PRO. O curso de Competitive Programming Academy inclui 4 aulas no total.
O que vou aprender em “Conte Subarrays com uma Soma-Alvo”?
Combine somas de prefixos com um mapa hash. Você pratica Competitive Programming Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Competitive Programming Academy?
Nenhuma experiência prévia é necessária. Competitive Programming Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Conte Subarrays com uma Soma-Alvo”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Competitive Programming Academy?
Sim. Cada aula de Competitive Programming Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Crie um Array de Somas de Prefixos
- Some Qualquer Intervalo com Subtração
- Conte Subarrays com uma Soma-Alvo
- Arrays de Diferenças para Atualizações de Intervalos