2011-12-08 6 views
2

배열에서 두 숫자의 합계를 모두 찾아야합니다. 그것이 같으면 인쇄하십시오. 이 문제에 대한 선형 해결책은 O (N^2) 복잡도입니다. 정렬 및 이진 비교를 생각했습니다. 복잡도는 여전히 (NlogN + N)정렬되지 않은 배열에서 값 찾기

문제는 모든 조합을 찾아야한다는 것입니다.

이 문제의 선형 해결책 예 :

//Linear search, find all the combinations 
Find(int a[], int Target) 
    { 
     for(i=0; i<arr_size; i++) 
      for(j=0; j<arr_size; j++) 
       if((a[i]+a[j]) == Target) 
        cout<<a[i]<<a[j] 
    } 

추가로 복잡성을 줄일 수있는 방법이 있습니까?

덕분에, 전문가

+1

개선 "복잡성은 여전히 ​​(NlogN + N)이다"- O (NlogN)의 복잡성에 어떤 문제가 있습니까? –

+0

선형 솔루션은'if (i! = j && (a [i] + a [j]) == Target''을 가져야합니다. 분류 자체가 복잡해지면 정렬이 어떻게 도움이되는지 명확하지 않습니다. – nnnnnn

답변

0

는 먼저 모든 불가능한를 필터링 할 수 있습니다. 이는 배열을 통해 두 번의 반복 만 필요하며 세트를 대폭 줄일 수 있습니다. 그렇지 않다면 2 번의 반복을 잃어버린 것입니다.

우선, 가장 적은 숫자를 찾아서 모든 값> (목표 - 최소 숫자)를 필터링 할 수 있습니다.

0

는 약간 성능

private static void find(int[] a, int target) { 

    for (int i = 0; i < a.length; i++) { 
     if (a[i] == target) { 
      System.out.println("result found"); 
      break; 
     } 
     if (a[i] > target) { 
      break; 
     } 
     for (int j = 0; j < a.length; j++) { 
      if ((i != j && (a[i] + a[j]) == target)) { 
       System.out.println("result found"); 
      } 
     } 
    } 
} 
+0

집합의 모든 요소가 음수가 아닌 것으로 가정합니까? –

+0

예, 배열에 양수 값이 있다고 가정합니다. –

+0

네거티브 허용, 위의 알고리즘을 사용해야 할 것입니다. 어쨌든, 그것은 같은 생각입니다. –

관련 문제