Contar sem fazer dois lookups de hash por item, o tamanho exato de entrada em que Array.Sort para de preservar a ordem, e o heap que C# só ganhou no .NET 6 — que a maioria do código antigo de maratona em C# ainda contorna na mão.
Uma pilha que se recusa a guardar qualquer coisa inútil responde qual é o próximo elemento maior de um array inteiro em uma passada — e a mesma estrutura mede o maior retângulo de um histograma.
Encontrar um valor num array ordenado é a coisa menos útil que a busca binária faz. O padrão que importa busca num espaço de respostas que ninguém nunca construiu, e não precisa de array ordenado nenhum.
Pré-calcule uma vez e responda qualquer pergunta sobre um intervalo em tempo constante — e o truque inverso que quase ninguém ensina, que aplica uma atualização a um intervalo inteiro escrevendo duas células.
Os dois ponteiros andam para o mesmo lado e o espaço entre eles é a resposta. Quatro formatos de janela, mais o truque de contagem que transforma “exatamente K” numa subtração, porque “exatamente K” não dá para deslizar direto.
Cinco padrões que não precisam de memória extra nenhuma — dois inteiros e o array que te deram. Onde cada um se aplica, por que é linear, e a linha do último que todo mundo escreve ao contrário.
O asdict() converte uma dataclass em dict e desce recursivamente até o fim, copiando no caminho. Quase sempre é o que você quer, e de vez em quando é bem o contrário.
O laço que você está prestes a escrever provavelmente já está na biblioteca padrão. islice, chain, pairwise e groupby cobrem a maioria, e o groupby tem uma regra que você não pode pular.
Um generator é um iterador que você escreve como uma função comum. Ele pausa no yield, volta de onde parou, e nunca monta a lista que você ia montar.
Um laço for são três passos que você mesmo poderia escrever. Depois de ver os três, o bug do vazio na segunda vez deixa de ser surpresa e vira óbvio.