2017-11-19 10 views
-3

です。これは、合計がtargetNumで割り切れる配列内の別個のトリプレットの総数を見つける簡単なJavaコードです。コードは正常に動作しますが、時間の複雑さがO(n^2)以上でないことを確認する必要があります。以下のJavaコードの時間複雑度は

public static void main(String [] args){ 

    int totalNum = 10; 
    int targetNum = 5; 
    int inputArray[] = { 1,10,4,3,2,5,0,1,9,5 }; 


    HashMap<Integer,int[]> tempMap = new HashMap<>(); 
    int tempCount=1; 
    for(int i=0; i<totalNum-2; i++){ 
     for(int j=i+1; j<totalNum; j++){ 

      int num1 = inputArray[i]; 
      int num2 = inputArray[j]; 
      int [] tempArr = new int[2]; 
      tempArr[0] = num1+num2; 
      tempArr[1] = j; 
      tempMap.put(tempCount,tempArr); 
      tempCount++; 
     } 
    } 
    int finalCount=0; 
    for(int i=1; i<tempCount; i++){ 
     int [] tempArr = tempMap.get(i); 
     int val1 = tempArr[0]; 
     int startIndex = tempArr[1]+1; 

     for(int j=startIndex; j<totalNum; j++){ 
      int val2 = inputArray[j]; 
      if((val1+val2)%targetNum == 0){ 
       finalCount++; 
      } 
     } 

    } 
    System.out.print(finalCount); 
} 

答えて

2

投稿されたコードの時間複雑度はO(n^3)です。

最初のループはO(n^2)です。これはネストされたループで、両方のループの範囲はO(n)に比例します。

2番目のループはO(n^3)です。最初のループ(別のループにネストされた1つのループ)とよく似ていますが、外側ループの範囲はO(n^2) O(n)へのループ。それは合計O(n^3)を与える。

+0

ご意見ありがとうございます。私はそれをn^2、 –

+1

@RohanJainに持ってきて、O(n)の2つの数字のためにこのタスクを解決しようとすると、アプローチを見て簡単にあなたのケースに拡張します。 – user3707125

+0

これは実際の質問です。 三和の数は、その総和が神話の定数で割り切れるならば特別です。Mは、数の異なる三つ組のうちのどれがその合計をMで割り切れるかを調べます。残念なことに、この問題は、彼はあなたの助けを必要とします。Input入力として2つの整数NとMをとり、それぞれシーケンスの整数の数と神話の定数を表します。次に、N個の整数を入力として取ります(重複した整数が許されます)。出力には1つの整数、Mで割り切れる合計を持つ別個のトリプレットの数だけが含まれます –