Approach
1. Sort the array
2. for each element c=arr[i] in the array
3. left=0; right=i;
4. while left<right
5. check if c==arr[left]+arr[right]
6. then add c to output
7. else if c<arr[left]+arr[right] right--
8. else left++
9. end
10.end
#include <iostream> using namespace std; int compare (const void * a, const void * b); void sum3(int arr[], int n); void main(){ int arr[]={2,3,5,1,4,9}; qsort(arr,6,sizeof(int),compare); sum3(arr,6); } void sum3(int arr[], int n){ int l,r; int count=0; int index[6]; int curr=0; for(int i=n-1;i>=0;i--) { l=0; r=i; while(l<r){ curr=arr[l] +arr[r]; if(arr[i] == curr){ index[count++]=i; cout<<arr[i]<<" "; break; } else if(arr[i] < curr) r--; else l++; } } } int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); }
Complexity of the above procedure is O(n^2). Apparently a better solution for the problem doesn't exist. Also, a number of problems can be reduced to the 3 sum problem and are called 3sum hard.
No comments:
Post a Comment