Open In App

C Program for Given a sorted and rotated array, find if there is a pair with a given sum

Write a C program for a given array arr[] of distinct elements size N that is sorted and then rotated around an unknown point, the task is to check if the array has a pair with a given sum X.

Examples : 



Input: arr[] = {11, 15, 6, 8, 9, 10}, x = 16
Output: true
Explanation: There is a pair (6, 10) with sum 16

Input: arr[] = {11, 15, 26, 38, 9, 10}, x = 35
Output: true
Explanation: There is a pair (26, 9) with sum 35



Input: arr[] = {11, 15, 26, 38, 9, 10}, x = 45
Output: false
Explanation: There is no pair with sum 45.

We have discussed an O(n) solution for a sorted array (See steps 2, 3, and 4 of Method 1) in this article. We can extend this solution for the rotated arrays as well.

Approach:

First find the largest element in an array which is the pivot point also and the element just after the largest is the smallest element. Once we have the indices of the largest and the smallest elements, we use a similar meet-in-middle algorithm (as discussed here in method 1) to find if there is a pair.
The only thing new here is indices are incremented and decremented in a rotational manner using modular arithmetic.

Illustration:

Let us take an example arr[]={11, 15, 6, 8, 9, 10}, sum=16.
pivot = 1,
l = 2, r = 1:
=> arr[2] + arr[1] = 6 + 15 = 21 which is > 16
=> So decrement r circularly. r = ( 6 + 1 – 1) % 6, r = 0

l = 2, r = 0:
=> arr[2] + arr[0] = 17 which is > 16.
=> So decrement r circularly. r = (6 + 0 – 1) % 6, r = 5

l = 2, r = 5:
=> arr[2] + arr[5] = 16 which is equal to 16.
=> Hence return true
Hence there exists such a pair.

Step-by-step approach:

Below is the implementation of the above approach:




// C code to implement the approach
#include <stdio.h>
 
// This function returns true if arr[0..n-1]
// has a pair with sum equals to x.
int pairInSortedRotated(int arr[], int n, int x)
{
    // Find the pivot element
    int i;
    for (i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            break;
        }
    }
    // l is now index of smallest element
    int l = (i + 1) % n;
    // r is now index of largest element
    int r = i;
 
    // Keep moving either l or r till they meet
    while (l != r) {
 
        // If we find a pair with sum x,
        // we return true
        if (arr[l] + arr[r] == x) {
            return 1;
        }
 
        // If current pair sum is less,
        // move to the higher sum
        if (arr[l] + arr[r] < x) {
            l = (l + 1) % n;
            // Move to the lower sum side
        }
        else {
            r = (n + r - 1) % n;
        }
    }
    return 0;
}
 
// Driver code
int main()
{
    int arr[] = { 11, 15, 6, 8, 9, 10 };
    int sum = 16;
    int n = sizeof(arr) / sizeof(arr[0]);
 
    // Function call
    if (pairInSortedRotated(arr, n, sum)) {
        printf("true\n");
    }
    else {
        printf("false\n");
    }
 
    return 0;
}

Output
true

Time Complexity: O(n). The step to find the pivot can be optimized to O(Logn) using the Binary Search approach discussed here.
Space Complexity: O(1)

C Program for Given a sorted and rotated array, find if there is a pair with a given sum using Two Pointers Technique and Binary Search.

The approach finds the pivot element in the rotated sorted array and then uses two pointers to check if there is a pair with a given sum. The pointers move in a circular way using the modulo operator.

Steps-by-step approach:

Below in the implementation of the above approach:




// C code to implement the approach
#include <stdio.h>
 
// Function to find a pair with a given sum in a sorted and
// rotated array
int findPair(int arr[], int n, int x)
{
    // Find the pivot element
    int pivot = 0;
    for (int i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            pivot = i + 1;
            break;
        }
    }
 
    // Set left and right pointers
    int left = pivot;
    int right = (pivot - 1 + n) % n;
 
    // Loop until left and right pointers meet
    while (left != right) {
        // If the sum of elements at left and right pointers
        // is equal to x, return 1 (true)
        if (arr[left] + arr[right] == x) {
            return 1;
        }
 
        // If the sum of elements at left and right pointers
        // is less than x, move the left pointer to the next
        // element
        else if (arr[left] + arr[right] < x) {
            left = (left + 1) % n;
        }
 
        // If the sum of elements at left and right pointers
        // is greater than x, move the right pointer to the
        // previous element
        else {
            right = (right - 1 + n) % n;
        }
    }
 
    // Return 0 (false) if a pair is not found
    return 0;
}
 
// Driver Code
int main()
{
    // Initialize array and variables
    int arr[] = { 11, 15, 6, 8, 9, 10 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 16;
 
    // Call the function and print the result
    if (findPair(arr, n, x)) {
        printf("true\n");
    }
    else {
        printf("false\n");
    }
 
    return 0;
}

Output
true

Time Complexity: O(n) 
Auxiliary Space: O(1) 

Exercise: 
Extend the above solution to work for arrays with duplicates allowed.
Please write comments if you find anything incorrect, or you want to
share more information about the topic discussed above
 Please refer complete article on Given a sorted and rotated array, find if there is a pair with a given sum for more details!


Article Tags :