2016-12-01 41 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變量的所有變體。