3 Sum Problem

Written by

studymite

3 sum is a simple problem on the face of it, but there are a couple of things that make it tricky:

  • Ensuring no duplicate outputs.
  • Creating the O(n2) solution instead of the O(n3) straightforward solution.

We take a list of integers and return possible groupings of three integers that sum up to either 0 or any specific number (k).

EX-

SUM = 0

Input: [-4, 1, 2, -2, 0, -1]

A solution set is: [ [1, 0, -1], [2, -2, 0] ]

SUM = K

Input: [2, 7, 11, 15, 3] , Sum: 20.

A solution set is: [ [2, 7, 11], [2, 15, 3] ]

# Brute Force

#include <iostream.h>
#include <conio.h>

void findtriplet(int Num[], int size_of_arr, int sum)
{
	int i, k, j, r, flag = 0;
	// Fixing the first element of triplet as Num[i]
	for (i = 0; i < size_of_arr - 2; i++)
	{
		// Fixing the second element of triplet as A[j]
		for (j = i + 1; j < size_of_arr - 1; j++)
		{
			// Now fixing the third element of triplet
			for (k = j + 1; k < size_of_arr; k++)
			{
			 	// Checking for the sum of the triplet
				if (Num[i] + Num[j] + Num[k] == sum)
				{
					cout << "Triplet is " << Num[i] << ", " << Num[j] << ", " << Num[k];
					cout << endl;
					// Task performed
					flag = 1;
				}
			}
		}
	}

	// If we reach here, then no triplet was found
	if (flag == 0)
	{
		cout << "Triplet not found";
	}
}

void main()
{
	clrscr();
	int Num[] = { 3, 10, 31, 5, 12, 8 };
	/*the values can also be entered by the user using this loop
	 int n;
	 cout<<"enter total number of entries :";
	 cin>>n;
	 cout<<"Enter the data\n";
	 for(int i=0;i < n;i++)
	         cin>>data[i];
	 */
	int sum = 46;
	int size_of_arr = sizeof(Num) / sizeof(Num[0]);

	// function calling
	findtriplet(Num, size_of_arr, sum);
	getch();
}

The Time Complexity of the above code is O(n3).

But the Time Complexity can be reduced to O(n2) and code can be optimized by using the sorting method.

# Optimised Approach

#include <iostream.h>
#include <conio.h>
#include <algorithm.h>//for sort()

void numbers(int data[], int size_of_arr, int total_sum)
{
	int l, t;
	/*Sorting of the elements */
	sort(data, data + size_of_arr);

	/*fixing the first element one by one and find the other two elements using for loop */
	for (int i = 0; i < size_of_arr - 2; i++)
	{
		l = i + 1;	//index of first element

		t = size_of_arr - 1;	// index of the last element 
		int flag = 0;
		//finding the numbers with the help of while loop
		while (l < t)
		{
			if (data[i] + data[l] + data[t] == total_sum)
			{
				cout << "Triplet with sum " << total_sum << " is :" << data[i] << ",                 " << data[l] << ", " << data[t] << endl;
				//flag will be 1 if the triplet is found in the given data[]
				flag = 1;
			}
			else if (data[i] + data[l] + data[t] < total_sum)
				l++;
			else
				t--;
		}
	}
	if (flag == 0)
		cout << "No triplet was found\n";
}

void main()
{
	clrscr();
	int data[] = { 5, 7, 9, 11, 45, 77 };
	/*the values can also be entered by the using using this loop
    	int n;
    	cout<<"enter total number of entries :";
    	cin>>n;
    	cout<<"Enter the data\n";
    	for(int i=0;i < n;i++)
            	cin>>data[i];
    	*/
	int total_sum = 25;
	//for user entry use cin>>total_sum
	int size_of_arr = sizeof(data) / sizeof(data[0]);
	//calling the function
	numbers(data, size_of_arr, total_sum);
	getch();
}
3 Sum Problem