Combinações de tamanho N

Crie um método genérico que retorne todas as combinações de tamanho n de uma coleção que já está ordenada. Preserve a ordem de entrada dos elementos dentro de cada combinação e retorne as combinações em ordem lexicográfica crescente. Os elementos podem ser números, strings ou qualquer outro tipo de elemento compatível com o código inicial fornecido.

Exemplos

Program.Combo(new int[] { 1, 2, 3, 4 }, 1) ➞ new int[][] { new int[] { 1 }, new int[] { 2 }, new int[] { 3 }, new int[] { 4 } }

Program.Combo(new int[] { 1, 2, 3, 4 }, 2) ➞ new int[][] { new int[] { 1, 2 }, new int[] { 1, 3 }, new int[] { 1, 4 }, new int[] { 2, 3 }, new int[] { 2, 4 }, new int[] { 3, 4 } }

Program.Combo(new int[] { 1, 2, 3, 4 }, 5) ➞ new int[][] {  }

Program.Combo(new int[] { 1, 2, 3, 4 }, 0) ➞ new int[][] { new int[] {  } }

Observações

  • A ordem lexicográfica compara primeiro os primeiros elementos: [1, 2] vem antes de [2, 4]. Quando os primeiros elementos são iguais, compare os segundos: [1, 2] vem antes de [1, 3], e assim por diante.
  • Retorne uma coleção externa vazia se n exceder o tamanho da entrada.
  • Retorne uma combinação vazia se n for 0, pois existe exatamente uma combinação de tamanho zero.