Algorithm to find a pair of integers in unsorted array with a given sum k.
Example
Input: var arr = [15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10]; k = 25; Output: true (If found) or false (If Not found)
1. Brute Force Method (Naive Approach) O(n^2)
In brute force method we will evaluate all the possible pairs and check if desired sum is found.
function findSum(arr, k){ //Length of array var len = arr.length; //Initialize to false so that it can be checked var isFound = false; //Check each element for(var i = 0; i < len; i++){ //Check with every next element for(var j = i+1; j < len; j++){ //If matched if(arr[i] + arr[j] === k){ //Mark true and break; isFound = true; break; } } } //Return return isFound; } console.log(findSum([15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10], 25)); console.log(findSum([15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10], 100));
Output: true (15+10) (4 + 21) (11 + 14) (24 + 1) false
Time complexity: O(n^2).
Space complexity: O(1).
Explanation
- Starting form the frist element in the array we sum it with it's every next elements.
- 15 -> (15 + 4) -> (15 + 9) -> (15 + 3) -> (15 + 2) -> (15 + 12) -> (15 + 11) -> (15 + 14) -> (15 + 21) -> (15 + 24) -> (15 + 1) -> (15 + 10)(found)
- If found we break the loop, Else continue the process with next element in the array until pair with given sum is found.
Time and Space Complexity
- We are looping each element with all its next elements like n(n-1) + n-1(n-2) + n-2(n-3) ... => n(n-1)/2 => O(n^2)
- We are just using one extra variable isFound so space complexity = O(1)
2. Using Sorting O(nlogn)
In this approach we sort the given array in ascending order and maintain two indices one at lowest(0) and another at highest(Array.length - 1) and check until lower index is less than higher index.
function findSum(arr, k){ //Sort the array (Inbuilt function) arr.sort(); //Maintain two index var low = 0; var high = arr.length - 1; //Initialize to false var isFound = false; //loop till low < high while(low < high){ //if pair is found if(arr[low] + arr[high] === k){ isFound = true; break; } //reduce the search array if(arr[low] + arr[high] < k){ low++; }else{ high--; } } return isFound; } console.log(findSum([15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10], 25)); console.log(findSum([15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10], 100));
Output: true false
Time complexity: O(nlogn).
Space complexity: O(1).
Explanation
Example 1 After Sorting: arr = [1, 2, 3, 4, 9, 10, 11, 12, 14, 15, 21, 24] k = 25
- We will start by adding first(low) and last element(high) in the array
- arr[low] + arr[high] = 1 + 24 = 25
- It is equal to k so break the loop, pair with given sum found
Example 2 After Sorting: arr = [1, 2, 3, 4, 9, 10, 11, 12, 14, 15, 21, 24] k = 100
- We will start by adding first(low) and last element(high) in the array
- arr[low] + arr[high] = 1 + 24 = 25 != k
- If arr[low] + arr[high] < k then low++, so low = 1
- Repeat the process again
- arr[low] + arr[high] = 2 + 24 = 26 != k
- If arr[low] + arr[high] < k then low++, so low = 2
- Repeat until the pair with given sum k is found, If found break else repeat
Time and Space complexity
- We are sorting the array which takes O(nlogn) and then checking with looping on each element of array which is O(n) so O(nlogn + n) = O(nlogn)
- We are just using one extra variable isFound so space complexity = O(1)
3. Using Hashing O(n)
In this approach we store each element in HashMap and also check if difference(k - arr[i]) already exits or not, if found break the loop. Using this method we can solve this in linear time O(n).
function findSum(arr, k){ //use set to store unique elements var hashMap = new Set(); //Initialize to false var isFound = false; //Loop through each element for(var i = 0; i < arr.length; i++){ //Check if difference pair already exists in hashMap if(hashMap.has(k - arr[i])){ isFound = true; break; } hashMap.add(arr[i]); } return isFound; } console.log(findSum([15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10], 25)); console.log(findSum([15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10], 100));
Output: true false
Time complexity: O(n).
Space complexity: O(n).
Explanation
Example 1 arr = [15, 4, 9 ,3 ,2, 12, 11, 14, 21, 24, 1, 10] k = 25
- We will start by creating new hashMap to store the unique values.
- s.has(k - arr[i]) = s.has(25 - 15 = 10), No then continue and store the arr[i] i.e 15 in s.
- Repeat until the pair with given sum k is found, If found return true else return false.
Time and Space complexity
- As worst case for searching in HashMap is O(N), Time Complexity = O(N).
- We are storing each value of array in HashMap, Space Complexity = O(N).
Adela says:
I seriously love your blog.. Excellent colors & theme. Did you make this amazing site
yourself? Please reply back as I’m hoping to create my very own blog and would
like to know where you got this from or exactly what the theme
is called. Cheers!
Prashant Yadav says:
I have designed it myself.
impassive says:
Ԍreat article, just what I needed.