2014-09-30 80 views
0

你好,我是一個Java noob,我無法理解這段代碼。打印不同三元組的方法

下面是代碼:

//print distinct triples (i, j, k) such that a[i] + a[j] + a[k] = 0 
public static void printAll(int[] a) { 
    int N = a.length; 
    Arrays.sort(a); 
    for (int i = 0; i < N; i++) { 
     for (int j = i+1; j < N; j++) { 
      int k = Arrays.binarySearch(a, -(a[i] + a[j])); 
      if (k > j) StdOut.println(a[i] + " " + a[j] + " " + a[k]); 
     } 
    } 
} 

我不明白安靜此行

int k = Arrays.binarySearch(a, -(a[i] + a[j])); 

誰能幫助我? 非常感謝。

+2

您是否閱讀過該方法的文檔?你知道什麼是二進制搜索嗎? – njzk2 2014-09-30 19:28:28

+0

是的,我知道二分查找,但是讓我困惑的是爲什麼在這裏使用 - (a [i] + a [j])。對不起,我是一個初學者:( – user3342026 2014-09-30 19:32:13

+0

)我們正在尋找驗證a [k] + a [j] + a [i] == 0的a [k]值,即'a [k] = - (a [j] + a [i])'沒有別的, – njzk2 2014-09-30 19:34:16

回答

1

[...]讓我感到困惑的是,爲什麼在這裏使用-(a[i]+a[j])

他們尋找這個值,因爲這可以使i + j + k = 0唯一值:

鑑於

a[i] + a[j] + a[k] = 0 

,然後求解a[k]給出:

a[k] = -(a[i] + a[j]) 
+0

也是,'if(k> j)'不是爲了優化,而是爲了確保結果的唯一性。 njzk2 2014-09-30 19:35:54

+0

沒錯,謝謝你幫我解決問題。 – aioobe 2014-09-30 19:36:15

+0

謝謝你的幫助! – user3342026 2014-09-30 19:37:49

0

的binarySearch方法搜索第二個參數的位置(在這種情況下, - (a [i] + a [j]))在第一個參數中提供的數組中。該數組必須進行排序。例如:

int[] ia = [ 2, 4, 6, 8, 10 ]; 
int i = Arrays.binarySearch(ia, 6); 
// i == 2, since ia[2] = 6