- Write a program to find a pair whose sum is closest to zero.
- Algorithm to find a pair of number whose sum is nearest to zero.
Given an integer array of size N containing both positive and negative elements. We have to find a pair of elements whose some is closest to zero.
For Example :
Input Array : -14 40 35 -56 -25 24 70 -60 5 -20 Pair : [-25, 24]
Let inputArray be an integer array of size N.
Using Brute Force
- Using two loops, find the sum of each possible pairs of elements and return a pair whose sum is closest to 0.
C program to print a pair whose sum is closest to zero
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/* Prints a pair of array elements
whose sum is closest to 0 */
void printMinSumPair(int *array, int size){
int i, j, sum, minSum, minPairOne, minPairTwo;
/* Input Validation */
if(array == NULL || size < 2)
return;
/* For every element array[i] find it's sum with
every other element array[j](i < j < size) */
minPairOne = array[0];
minPairTwo = array[1];
minSum = minPairOne + minPairTwo;
for(i = 0; i < size-1; i++) {
for(j = i+1; j < size; j++) {
sum = array[i] + array[j];
if(abs(sum) < abs(minSum)) {
minSum = sum;
minPairOne = array[i];
minPairTwo = array[j];
}
}
}
printf("[%d, %d]\n", minPairOne, minPairTwo);
}
int main(){
int array[10] = {-14, 40, 35, -56, -25, 24, 70, -60, 5, -20};
int i;
printf("Array\n");
for(i = 0; i<10; i++){
printf("%d ", array[i]);
}
printf("\nMinimum Sum Pair\n");
printMinSumPair(array, 10);
return 0;
}
OutputArray -14 40 35 -56 -25 24 70 -60 5 -20 Minimum Sum Pair [-25, 24]
By Sorting Input Array
- Sort inputArray using any nLogn average time sorting algorithm like quick sort, merge sort etc.
- Initialize left and right to 0 and N-1.
- Find the sum of inputArray[left] and inputArray[right]. Let it be "sum".
- If Compare the sum with the cum of closest zero pair found till now and update it accordingly.
- If sum is < 0 then we have to increase the sum of pair hence increment left.
- If is sum > 0 then we have to reduce the sum of pair hence decrement right.
- Continue above steps until left < right.
C program to find a pair whose sum is closest to zero using sorting
#include <stdio.h>
#include <limits.h>
#include <stdlib.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;
}
/* Prints a pair of array elements
whose sum is closest to 0 */
void printMinSumPair(int *array, int size) {
int left, right, sum, minSum, minPairOne, minPairTwo;
/* Sort elements of array using quick sort algorithm */
quickSort(array, 0, size-1);
/* Initialize left and right to first and
last index of array */
left = 0;
right = size-1;
minSum = INT_MAX;
while(left < right) {
sum = array[left] + array[right];
/*Check if sum of array[left] and array[right]
is less than to minSum */
if(abs(sum) < abs(minSum)) {
minSum = sum;
minPairOne = array[left];
minPairTwo = array[right];
}
if(sum < 0) {
/* If sum < 0, then increase the value
of sum by incrementing left index */
left++;
} else {
/* sum is greater than 0, decrease
value of sum by decrementing right index */
right--;
}
}
printf("[%d, %d]\n", minPairOne, minPairTwo);
}
int main(){
int i, array[100], count;
printf("Enter the number of elements in Array\n");
scanf("%d", &count);
printf("Enter %d numbers\n", count);
for(i = 0; i < count; i++){
scanf("%d", &array[i]);
}
printf("\nMinimum Sum Pair\n");
printMinSumPair(array, count);
return 0;
}
OutputEnter the number of elements in Array 10 Enter 10 numbers -14 40 35 -56 -25 24 70 -60 5 -20 Minimum Sum Pair [-25, 24]