Найти уникальные тройки
В моей функции я должен найти все уникальные триплеты с заданными числами 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
переменные.