寻找独特的三胞胎

Find unique triplets

在我的函数中,我必须从给定数组中找到给定数字 K 的所有唯一三元组。它找到了所有三胞胎,但其中许多三胞胎出现了两次或更多次,例如 1 1 51 5 15 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;
}

要排除组合,您可以尝试进行以下更改:

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;
}

注意 for loop 声明中的 j = ik = j 语句。通过这种方式,您将跳过您的案例可能的重复项,同时涵盖 ijk 变量的所有变体。

您不应该重复已经处理过的组合;一个可能的解决方案是从前一个 ID + 1 开始每个 for 循环,如下所示:

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;你防止同元素三胞胎!