Given an array of integers and a value, determine if there are any three integers in the array whose sum equals the given value.
Consider this array and the target sums.
bool find_sum_of_two(vector<int>& A, int val, size_t start_index) { for (int i = start_index, j = A.size() - 1; i < j;) { int sum = A[i] + A[j]; if (sum == val) { return true; } if (sum < val) { ++i; } else { --j; } } return false; } bool find_sum_of_three_v3(vector<int> arr, int required_sum) { std::sort(arr.begin(), arr.end()); for (int i = 0; i < arr.size() - 2; ++i) { int remaining_sum = required_sum - arr[i]; if (find_sum_of_two(arr, remaining_sum, i + 1)) { return true; } } return false; } int main(){ vector<int> arr = {-25, -10, -7, -3, 2, 4, 8, 10}; cout<<"-8: " <<find_sum_of_three_v3(arr, -8)<<endl; cout<<"-25: "<<find_sum_of_three_v3(arr, -25)<<endl; cout<<"0: " <<find_sum_of_three_v3(arr, 0)<<endl; cout<<"-42: " <<find_sum_of_three_v3(arr, -42)<<endl; cout<<"22: " <<find_sum_of_three_v3(arr, 22)<<endl; cout<<"-7: " <<find_sum_of_three_v3(arr, -7)<<endl; cout<<"-3: " <<find_sum_of_three_v3(arr, -3)<<endl; cout<<"2: " <<find_sum_of_three_v3(arr, 2)<<endl; cout<<"4: " <<find_sum_of_three_v3(arr, 4)<<endl; cout<<"8: " <<find_sum_of_three_v3(arr, 8)<<endl; cout<<"7: " <<find_sum_of_three_v3(arr, 7)<<endl; cout<<"1: " <<find_sum_of_three_v3(arr, 1)<<endl; return 0; }
Quadratic, O(n2)
Constant, O(1)
In this solution, we first sort the array. Then we fix one element ‘e’, and try to find a pair (a, b) in the remaining array such that required_sum - e = a + b.
We start with the first element e in the array (at index i = 0) and try to find such a pair (a, b) in the remaining array (i.e A[i + 1] to A[n - 1]) that satisfies the condition: a+b = required_sum - e. We can find such a pair in linear time. If we find such a pair, we have found the solution: a, b and e and thus, we can stop the iteration.
Otherwise, we repeat the above steps for all elements e at index i = 1 to n - 3, until we find a pair that meets the condition.