2017-01-22 17 views
2

我對編程非常陌生。我需要使用給定的整數數組有效地找到K互補對。我寫了下面的代碼。它包括重複。我需要消除這種重複。所以請幫助我刪除重複,並請建議是否有更好的方法來做到這一點。使用給定的整數數組有效的K互補對

public class KComplexityOfArray { 


public static StringBuffer oldFunction(int arr[], int k) { 
    int result = 0; 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr.length; j++) { 
      if (i != j && arr[i] + arr[j] == k) { 
       sb.append(arr[i] + "," + arr[j]); 
       result++; 
      } 
     } 
    } 
    System.out.println(result); 
    return sb; 
} 



public static void main(String[] args) { 
    int[] intArray1 = new int[]{4, 5, 6, 3, 1, 8, -7, -6, 7}; 
    int[] intArray2 = new int[]{1, 2, 7, 5, 6, 3}; 
    int[] intArray = new int[]{4, 5, 6, 3, 1, 8, -7, -6}; 
    int k = 9; 
    System.out.println("No of k complementary pairs : " + oldFunction(intArray2, k)); 
} 

}

請人幫助我理清了這一點。由於

回答

3

這段代碼是錯誤的,考慮兩種不同的元素構成了一對:

for (int i = 0; i < arr.length; i++) { 
    for (int j = 0; j < arr.length; j++) { 

相反,你應該做j=i+1

for (int i = 0; i < arr.length; i++) { 
    for (int j = i+1; j < arr.length; j++) { 

請建議是否有更好的方法來做到這一點。

您的解決方案的TC爲O(N^2)。相反,你可以在O(NlogN)中減少它。請參閱:

  1. 對數組進行排序。
  2. 使用兩個索引位置,ij設置爲0N-1分別。
  3. 現在,如果a[i]a[j]的總和等於k,則打印它。否則,如果sum < K,提前i通過1,否則通過1減小j
  4. 重複步驟3,直到(i < j)

步驟1需要O(NlogN)和其餘步驟採取O(N);結合兩個招致O(NLogN)

+0

int j = arr.length - 1;對於(int i = 0; i Dilee

+0

循環內部的'i ++'是錯誤的,因爲'i ++'無論如何會在'for'循環結束時發生,最終導致'i'的雙重增量。改用'while(i

+1

我試過了,它結束了內存不足的錯誤。 int j = arr.length - 1; int i = 0; (arr [i] + arr [j] == k){({「{」+ arr [i] +「,」+ arr [j] +「}}(i Dilee

0

如果我理解正確的話您的問題,您應該更換

for (int j = 0; j < arr.length; j++) { 

for (int j = i+1; j < arr.length; j++) { 
相關問題