Competitive Programming Academy · Lezione

Contare i sottoarray con una somma obiettivo

Combinare somme prefisse e una hash map

Lezione 3 di 413 passaggi

Contare i sottoarray con una somma obiettivo è una lezione Competitive Programming Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Competitive Programming Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Competitive Programming Academy include 4 lezioni in totale.

Una domanda più difficile

Ora arriva la parte interessante: contare quanti sottoarray hanno somma pari a un valore k. Controllare ogni coppia è lento, ma le somme prefisse insieme a una mappa hash risolvono il problema. 🎯

Riformulare con i prefissi

La somma di un sottoarray è uguale a prefix[r + 1] meno prefix[l]. Quindi una somma pari a k significa che due valori di prefisso differiscono esattamente di k.

Il riarrangiamento fondamentale

Se il prefisso corrente è P, le serve un prefisso precedente uguale a P meno k. Questo riarrangiamento è l'intero trucco.

need = current_prefix - k

Conti, non cerchi

Invece di tornare indietro a ogni iterazione, memorizzi quante volte è comparso ogni valore di prefisso. Un conteggio progressivo fornisce la risposta in O(1).

Usi una mappa delle frequenze

Un dizionario associa a ogni valore di prefisso il numero di volte in cui è comparso. Questa mappa trasforma la ricerca in un conteggio immediato.

from collections import defaultdict
seen = defaultdict(int)

Inizializzi il prefisso vuoto

Prima del ciclo, registri che il prefisso 0 è comparso una volta. Questo valore iniziale permette di contare i sottoarray che iniziano dall'indice 0.

seen[0] = 1

Il ciclo in un'unica passata

Per ogni elemento, aggiorni il prefisso progressivo, aggiunga il conteggio del valore necessario e poi registri il prefisso corrente. Una sola passata è sufficiente.

total += x
count += seen[total - k]
seen[total] += 1

Perché l'ordine è importante

Deve aggiornare la risposta prima di registrare il prefisso corrente. Altrimenti viene conteggiato anche un intervallo di lunghezza zero e il conteggio non è più corretto.

Il vantaggio in termini di velocità

Ogni elemento richiede un lavoro costante, quindi il conteggio completo viene eseguito in O(n). È molto più veloce della forza bruta O(n al quadrato) per input grandi.

Anche i numeri negativi vanno bene

A differenza delle finestre scorrevoli, questo metodo gestisce senza problemi i numeri negativi, perché le differenze tra prefissi restano valide indipendentemente dai segni.

Un caso d'uso classico

Questo schema risolve il famoso problema della somma del sottoarray uguale a k e molte varianti camuffate nei giudici di programmazione competitiva.

Verifica rapida

Il prefisso progressivo è P e l'obiettivo è k.

Riepilogo

Ora può contare i sottoarray con somma obiettivo in O(n), usando somme prefisse e una mappa delle frequenze. Inizializzi il prefisso 0, poi conti prima di registrare. ✅

Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Contare i sottoarray con una somma obiettivo» è gratuita?

Sì — il testo completo di «Contare i sottoarray con una somma obiettivo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Competitive Programming Academy, passa a CoddyKit PRO. Il corso Competitive Programming Academy include 4 lezioni in totale.

Cosa imparerò in «Contare i sottoarray con una somma obiettivo»?

Combinare somme prefisse e una hash map Eserciti Competitive Programming Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Competitive Programming Academy?

Non è richiesta alcuna esperienza precedente. Competitive Programming Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Contare i sottoarray con una somma obiettivo»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Competitive Programming Academy?

Sì. Ogni lezione Competitive Programming Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Creare un array delle somme prefisse
  2. Sommare qualsiasi intervallo con una sottrazione
  3. Contare i sottoarray con una somma obiettivo
  4. Array delle differenze per aggiornamenti su intervalli
← Torna a Competitive Programming Academy