Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsA forma mais direta é fixar quantas balas a primeira criança recebe e contar os valores válidos para a segunda; o que sobrar vai para a terceira. Para o LeetCode 2929, isso produz uma solução em tempo O(min(n, limit)) e espaço O(1), sem precisar enumerar cada distribuição. A assinatura exigida pelo juiz para Elixir não está estabelecida nas fontes consultadas, então confirme-a no ambiente antes de enviar.
O que o problema está contando
O LeetCode 2929 pede o número de maneiras de distribuir n balas idênticas entre três crianças distintas, de modo que nenhuma receba mais que limit. Cada criança pode receber de zero até limit, inclusive. Como as crianças são distintas, trocar quem recebe uma quantidade pode gerar uma distribuição diferente: para n = 5 e limit = 2, por exemplo, contam-se separadamente (1, 2, 2), (2, 1, 2) e (2, 2, 1). O enunciado oficial traz esse resultado, além de n = 3, limit = 3, cuja resposta é 10, e as restrições 1 ≤ n, limit ≤ 10^6 (enunciado oficial).
As an Amazon Associate I earn from qualifying purchases.
Como contar sem gerar cada distribuição
Chame de i a quantidade da primeira criança, de j a da segunda e de k a da terceira. Depois de escolher i, restam n - i balas para as duas crianças restantes, então k = n - i - j. Para respeitar os limites, j precisa ser grande o suficiente para que k não passe de limit, e pequeno o suficiente para que nem j nem k sejam negativos ou excedam o limite:
max(0, n - i - limit) ≤ j ≤ min(limit, n - i)
Assim, para cada i entre zero e min(n, limit), a quantidade de escolhas para j é max(0, superior - inferior + 1). O +1 é importante porque os extremos do intervalo também são válidos. Somar essas contagens cobre todas as distribuições exatamente uma vez. Essa enumeração dos limites é também apresentada na solução publicada do CodeJeet.
#1 Best Overall
Implementação em Elixir
Uma implementação recursiva com acumulador evita criar listas ou manter estado mutável. O intervalo do laço inclui zero e min(n, limit); em cada passo, o acumulador recebe a quantidade de valores possíveis para a segunda criança.
defmodule Solution do
def distribute_candies(n, limit) do
max_i = min(n, limit)
count(0, max_i, n, limit, 0)
end
defp count(i, max_i, _n, _limit, total) when i > max_i do
total
end
defp count(i, max_i, n, limit, total) do
remaining = n - i
low = max(0, remaining - limit)
high = min(limit, remaining)
choices = max(0, high - low + 1)
count(i + 1, max_i, n, limit, total + choices)
end
end
O módulo e o nome da função acima são ilustrativos. A página oficial consultada define o problema, mas não estabelece uma assinatura específica para Elixir; ajuste o nome, a visibilidade e a convenção de retorno ao formato pedido pelo juiz online. Os limites de entrada chegam a 10^6. Em Elixir, inteiros são de precisão arbitrária, portanto a implementação não depende de aritmética de inteiro fixo para esses valores.
Complexidade e alternativa de inclusão-exclusão
A enumeração executa no máximo min(n, limit) + 1 iterações e usa espaço constante, além da pilha de chamadas recursivas. Se preferir evitar recursão profunda, a mesma soma pode ser implementada com Enum.reduce sobre o intervalo; isso não muda a contagem, embora crie o intervalo enumerável.
Também é possível começar pelo número de soluções não negativas de x₁ + x₂ + x₃ = n, contado por estrelas e barras, e subtrair as soluções em que uma ou mais crianças excedem limit, alternando os sinais conforme inclusão-exclusão. Uma formulação publicada pelo WalkCCC expressa essa estratégia em quantidade constante de operações. Ela pode ser mais rápida em termos assintóticos, mas requer cuidado ao definir os termos combinatórios e tratar as condições de borda; a enumeração torna os limites individuais visíveis no próprio código. Não há benchmark em Elixir que justifique afirmar uma vantagem prática entre elas.
Quick Recap
Best Value
Rank #3
Verificações úteis
- Para
n = 5elimit = 2, o laço considerai = 0, 1, 2; a soma resulta em3. - Para
n = 3elimit = 3, todos os valores deide zero a três são considerados e a soma resulta em10. - Se
n > 3 × limit, a distribuição é impossível e o resultado deve ser zero. A fórmula também chega a esse resultado: para cadaipossível, o intervalo válido parajfica vazio. - Não comece
iem um: uma criança pode receber zero. Também não esqueça o+1ao contar os extremos inclusivos dej.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




