How to find all triplets with a zero sum in a given array with C

2 Answers

0 votes
#include <stdio.h>
#include <stdbool.h>

void findTripletsWith0Sum(int arr[], int size) {
    bool found = false;

    for (int i = 0; i < size - 2; i++) {
        for (int j = i + 1; j < size - 1; j++) {
            for (int k = j + 1; k < size; k++) {
                if (arr[i] + arr[j] + arr[k] == 0) {
                    printf("%d + %d + %d\n", arr[i], arr[j], arr[k]);
                    found = true;
                }
            }
        }
    }

    if (found == false) {
        printf("Not found");
    }
}

int main()
{
    int arr[] = { 1, 0, 3, 2, -1, -2, -3, 4 };
    int size = sizeof(arr) / sizeof(arr[0]);
    
    findTripletsWith0Sum(arr, size);
    
    return 0;
}



/*
run:

1 + 0 + -1
1 + 2 + -3
0 + 3 + -3
0 + 2 + -2
3 + -1 + -2
-1 + -3 + 4

*/

 



answered May 22, 2023 by avibootz
edited May 22, 2023 by avibootz
0 votes
#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

void findTriplets(int arr[], int n) {
    qsort(arr, n, sizeof(int), compare);

    for (int i = 0; i < n - 2; i++) {
        // Skip duplicate values for i
        if (i > 0 && arr[i] == arr[i - 1])
            continue;

        int left = i + 1;
        int right = n - 1;

        while (left < right) {
            int sum = arr[i] + arr[left] + arr[right];

            if (sum == 0) {
                printf("Triplet: %d, %d, %d\n", arr[i], arr[left], arr[right]);

                // Skip duplicates for left and right
                while (left < right && arr[left] == arr[left + 1]) left++;
                while (left < right && arr[right] == arr[right - 1]) right--;

                left++;
                right--;
            }
            else if (sum < 0) {
                left++;
            }
            else {
                right--;
            }
        }
    }
}

int main() {
    int arr[] = { 1, 0, 3, 2, -1, -2, -3, 4 };
    int n = sizeof(arr) / sizeof(arr[0]);

    findTriplets(arr, n);

    return 0;
}


/*
run:

Triplet: -3, -1, 4
Triplet: -3, 0, 3
Triplet: -3, 1, 2
Triplet: -2, -1, 3
Triplet: -2, 0, 2
Triplet: -1, 0, 1

*/

 



answered Apr 5 by avibootz

Related questions

1 answer 176 views
1 answer 228 views
1 answer 234 views
1 answer 228 views
1 answer 228 views
...