- Write a program to find three elements of given array whose sum is equal to K
- Algorithm to find a triplet whose sum is equal to given number.
Given an integer array of size N and an integer K. We have to find three array elements whose sum is equal to K.
For Example :
Input Array : 23, 8, 7, 7, 1, 9, 10, 4, 1, 3 K = 17 Output : 7, 7, 3
Let inputArray be an integer array of size N and we want to find a triplet whose sum is K.
Brute Force Approach
- Using three for loops, generate all possible combinations of triplets and compare their sum with K. If sum of triplet is equal to K then print otherwise continue.
C program to find triplet whose sum is given number
#include<stdio.h>
int isTripletSum(int *array, int size, int K) {
int i, j, k;
/* Brute Force Approach : Check the sum of all
possibel combinations of triplets */
for(i = 0; i < size-2; i++) {
for (j = i+1; j < size-1; j++) {
for (k = j+1; k < size; k++) {
/* Check if the sum of current triplets
is equal to "K" */
if(array[i] + array[j] + array[k] == K) {
printf("Triplet Found : %d, %d, %d", array[i], array[j], array[k]);
return 1;
}
}
}
}
/* No triplet found whose sum is equal to K */
return 0;
}
int main() {
int array[10] = {23, 8, 7, 7, 1, 9, 10, 4, 1, 3};
/* find a triplet whose sum is 17 */
if(!isTripletSum(array, 10, 17)){
printf("No Triplet Found");
}
return 0;
}
OutputTriplet Found : 7, 7, 3
By Sorting Input Array
Let firstIndex, secondIndex and thirdIndex are three integer variables.
- Sort inputArray using any O(nLogn) average time sorting algorithm like quick sort or merge sort.
- Initialize firstIndex to 0. Using firstIndex traverse inputArray from index 0 to N-2 and fix first element of triplet.
- Now, we have to find two array elements whose sum is equal to K-inputArray[firstIndex]. Let S = K-inputArray[firstIndex]
- Initialize secondIndex and thirdIndex to firstIndex+1 and N-1.(secondIndex=firstIndex+1; thirdIndex=N-1)
- If the sum of second and third element is equal to S, then we found one triplet.
- If the sum of second and third element is less than S, increment seconIndex else decrement third index.
- Continue until secondIndex < thirdIndex.
#include <stdio.h>
/* Swap array element at index left and right */
void swap(int array[], int left, int right) {
int temp;
/* Swapping using a temp variable */
temp = array[left];
array[left]=array[right];
array[right]=temp;
}
void quickSort(int array[], int left, int right) {
int pivot;
if (right > left) {
/* Partition the given array into
two segment by calling partion function */
pivot = partition(array, left, right);
/* Recursively sort left and right sub array*/
quickSort(array, left, pivot-1);
quickSort(array, pivot+1, right);
}
}
int partition(int array[], int left, int right) {
int temp = left;
int pivot = array[left];
while(left < right) {
/* From left side, search for a number
greater than pivot element */
while(array[left] <= pivot)
left++;
/* From right side, search for a number
less than pivot element */
while(array[right] > pivot)
right--;
/*Swap array[left] and array[right] */
if(left < right)
swap(array, left, right);
}
/* Put pivot element in it's currect position '*/
array[temp] = array[right];
array[right] = pivot;
/* Return partition index. All elements left of
right index is < pivot whereas elements right
side of right index are > pivot element */
return right;
}
/*
This function prints triplet whose sum is equal to K
*/
int isTripletSum(int *array, int size, int K) {
int first, second, third, currentSum, sum;
/* Sort elements of array using quick sort algorithm */
quickSort(array, 0, size-1);
/* Fix first element */
for(first = 0; first < size-2; first++) {
/* Initialize second and third to next element of first and
last index of array respectively */
second = first+1;
third = size-1;
/* sum id the remianing value of K to be found */
sum = K - array[first];
while(second < third) {
currentSum = array[second] + array[third];
/*Check if sun of array[second] and array[third]
is equal to sum */
if(currentSum == sum) {
printf("Triplet found : %d, %d, %d\n", array[first],
array[second], array[third]);
return 1;
} else if(currentSum < sum) {
/* If currentSum < sum, then increase the value
of currentSum by incrementing left index */
second++;
} else {
/* currentSum is greater than sum, decrease
value of currentsum by decrementing right index */
third--;
}
}
}
return 0;
}
int main(){
int array[10] = {23, 8, 7, 7, 1, 9, 10, 4, 1, 3};
/* find a triplet whose sum is 17 */
if(!isTripletSum(array, 10, 17)){
printf("No Triplet Found");
}
return 0;
}
OutputTriplet found : 1, 7, 9
Using Hash Table
Algorithm to find three numbers whose sum is equal to K using hash table.
- Traverse inputArray and put each element in hash table.
- Using two for loops, generate all possible combinations of two elements and find their sum. Let S = inputArray[i] + inputArray[j].
- Check if (K-S) exists in hash table. If true then we found a triplet (inputArray[i], inputArray[j] and K-S) whose sum is K.