Найти уникальные тройки

В моей функции я должен найти все уникальные триплеты с заданными числами K из данного массива. Он находит все триплеты, но многие из них там дважды или больше, как 1 1 5 такой же как 1 5 1 или же 5 1 1 и так далее.

Может ли кто-нибудь помочь мне с этим?

int triplet(int *array, int size, int K) {
  int i, j, k;
  int found = 0; /* triplets whose sum is equal to K */
  for(i = 0; i < size; i++) {
    for (j = 0; j < size; j++) {    
      for (k = 0; k < size; k++) {
        if(array[i] + array[j] + array[k] == K) {
          printf("Triplet Found : %d, %d, %d\n", array[i], array[j], array[k]);
          found++;
        }           
      }
    }
  }
  return found;
}

2 ответа

Решение

Вы не должны повторять уже обработанные комбинации; Возможное решение - начать каждый цикл с предыдущего идентификатора + 1, например, так:

for(i = 0; i < size; i++) {
 for (j = i+1; j < size; j++) {    
  for (k = j+1; k < size; k++) {
    if(array[i] + array[j] + array[k] == K) {
      printf("Triplet Found : %d, %d, %d\n", array[i], array[j], array[k]);
      found++;
    }           
  }
}

установка j = i + 1; Вы предотвращаете тройки с одним и тем же элементом!

Чтобы исключить комбинации, вы можете попробовать следующее изменение:

int triplet(int *array, int size, int K) {
  int i, j, k;
  int found = 0; /* triplets whose sum is equal to K */
  for(i = 0; i < size; i++) {
    for (j = i; j < size; j++) {    
      for (k = j; k < size; k++) {
        if(array[i] + array[j] + array[k] == K) {
          printf("Triplet Found : %d, %d, %d\n", array[i], array[j], array[k]);
          found++;
        }           
      }
    }
  }
  return found;
}

Обратите внимание на j = i а также k = j заявления в for loop деклараций. Таким образом, вы пропустите возможные дубликаты для вашего случая и при этом охватите все варианты i, j а также k переменные.

Другие вопросы по тегам