2016-12-01 37 views
0

在我的函数中,我必须找到给定数组K中给定数组的所有唯一三元组。它发现所有的三胞胎,但其中不少是有两次或两次以上类似1 1 5是相同1 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; 
} 

回答

0

您不应该重复已处理的组合;一个可能的解决办法是从德以前的ID + 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;可以防止同一元素三胞胎!

+0

使用'id + 1'将不适用于OP提供的示例(1 1 5) –

+0

我认为这是一个输出示例,而不是输入,它可以工作: – Giovazz89

+0

array [0] + array [1] + array [2] == K – Giovazz89

0

要排除的组合,你可以尝试以下变化:

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 = ik = j声明中for loop声明。通过这种方式,您可以跳过您的案例的可能重复项目,但涵盖了ijk变量的所有变体。