Pair with largest sum which is less than K in the array - GeeksforGeeks

04 May, 2022
Given an array arr of size N and an integer K. The task is to find the pair of integers such that their sum is maximum and but less than K
Examples: 
Input : arr = {30, 20, 50} , K = 70 Output : 30, 20 30 + 20 = 50, which is the maximum possible sum which is less than K 
Input : arr = {5, 20, 110, 100, 10}, K = 85 Output : 20, 10 
Approach : An efficient approach is to sort the given array and find the element which is greater than or equal to K. If found at index p, we have to find pairs only between arr[0, ..., p-1]. Run nested loops. One to take care of the first element in the pair and the other to take care of the second element in the pair. Maintain a variable maxsum and two other variables a and b to keep track of the possible solution. Initialize maxsum to 0. Find A[i] + A[j] (assuming i runs in the outer loop and j in the inner loop). If it is greater than maxsum then update maxsum with this sum and change a and b to the i’th and j’th elements of this array.Below is the implementation of the above approach : 
C++
Java
Python3
C#
Javascript
// CPP program to find pair with largest// sum which is less than K in the array#include <bits/stdc++.h>using namespace std; // Function to find pair with largest// sum which is less than K in the arrayvoid Max_Sum(int arr[], int n, int k){    // To store the break point    int  p = n;         // Sort the given array    sort(arr, arr + n);         // Find the break point    for (int i = 0; i < n; i++)    {         // No need to look beyond i'th index        if (arr[i] >= k) {            p = i;            break;        }    }              int maxsum = 0, a, b;         // Find the required pair    for (int i = 0; i < p; i++)    {        for (int j = i + 1; j < p; j++)        {            if (arr[i] + arr[j] < k and arr[i] + arr[j] >                                                     maxsum)            {                maxsum = arr[i] + arr[j];                                 a = arr[i];                b = arr[j];            }        }    }         // Print the required answer    cout << a << " " << b;} // Driver codeint main(){    int arr[] = {5, 20, 110, 100, 10}, k = 85;         int n = sizeof(arr) / sizeof(arr[0]);         // Function call    Max_Sum(arr, n, k);         return 0;}
// Java program to find pair with largest// sum which is less than K in the arrayimport java.util.Arrays; class GFG{ // Function to find pair with largest// sum which is less than K in the arraystatic void Max_Sum(int arr[], int n, int k){    // To store the break point    int p = n;         // Sort the given array    Arrays.sort(arr);         // Find the break point    for (int i = 0; i < n; i++)    {        // No need to look beyond i'th index        if (arr[i] >= k)        {            p = i;            break;        }    }         int maxsum = 0, a = 0, b = 0;         // Find the required pair    for (int i = 0; i < p; i++)    {        for (int j = i + 1; j < p; j++)        {            if (arr[i] + arr[j] < k &&                arr[i] + arr[j] > maxsum)            {                maxsum = arr[i] + arr[j];                                 a = arr[i];                b = arr[j];            }        }    }         // Print the required answer    System.out.print( a + " " + b);} // Driver codepublic static void main (String[] args){    int []arr = {5, 20, 110, 100, 10};    int k = 85;     int n = arr.length;         // Function call    Max_Sum(arr, n, k);}} // This code is contributed by anuj_67..
# Python3 program to find pair with largest# sum which is less than K in the array # Function to find pair with largest# sum which is less than K in the arraydef Max_Sum(arr, n, k):     # To store the break point    p = n         # Sort the given array    arr.sort()         # Find the break point    for i in range(0, n):                 # No need to look beyond i'th index        if (arr[i] >= k):            p = i            break         maxsum = 0    a = 0    b = 0         # Find the required pair    for i in range(0, p):            for j in range(i + 1, p):            if(arr[i] + arr[j] < k and               arr[i] + arr[j] > maxsum):                maxsum = arr[i] + arr[j]                a = arr[i]                b = arr[j]                     # Print the required answer    print(a, b) # Driver codearr = [5, 20, 110, 100, 10]k = 85 n = len(arr) # Function callMax_Sum(arr, n, k) # This code is contributed by Sanjit_Prasad
// C# program to find pair with largest// sum which is less than K in the arrayusing System; class GFG{ // Function to find pair with largest// sum which is less than K in the arraystatic void Max_Sum(int []arr, int n, int k){    // To store the break point    int p = n;         // Sort the given array    Array.Sort(arr);         // Find the break point    for (int i = 0; i < n; i++)    {        // No need to look beyond i'th index        if (arr[i] >= k)        {            p = i;            break;        }    }         int maxsum = 0, a = 0, b = 0;         // Find the required pair    for (int i = 0; i < p; i++)    {        for (int j = i + 1; j < p; j++)        {            if (arr[i] + arr[j] < k &&                arr[i] + arr[j] > maxsum)            {                maxsum = arr[i] + arr[j];                                 a = arr[i];                b = arr[j];            }        }    }         // Print the required answer    Console.WriteLine( a + " " + b);} // Driver codepublic static void Main (){    int []arr = {5, 20, 110, 100, 10};    int k = 85;     int n = arr.Length;         // Function call    Max_Sum(arr, n, k);}} // This code is contributed by anuj_67..
<script>    // Javascript program to find pair with largest    // sum which is less than K in the array         // Function to find pair with largest    // sum which is less than K in the array    function Max_Sum(arr, n, k)    {        // To store the break point        let p = n;         // Sort the given array        arr.sort(function(a, b){return a - b});         // Find the break point        for (let i = 0; i < n; i++)        {            // No need to look beyond i'th index            if (arr[i] >= k)            {                p = i;                break;            }        }         let maxsum = 0, a = 0, b = 0;         // Find the required pair        for (let i = 0; i < p; i++)        {            for (let j = i + 1; j < p; j++)            {                if (arr[i] + arr[j] < k &&                    arr[i] + arr[j] > maxsum)                {                    maxsum = arr[i] + arr[j];                     a = arr[i];                    b = arr[j];                }            }        }         // Print the required answer        document.write( a + " " + b + "</br>");    }         let arr = [5, 20, 110, 100, 10];    let k = 85;      let n = arr.length;          // Function call    Max_Sum(arr, n, k); </script>
10 20
Time complexity: O(N^2)
Efficient Approach: Two Pointer MethodAfter sorting, we can place two pointers at the left and right extremes of the array. The desired pair can be found by the following steps:
Find the current sum of the values at both the pointers.If the sum is lesser than k:update the answer with the maximum of the previous answer and the current sum.increase the left pointer.Else Decrease the right pointer.
Find the current sum of the values at both the pointers.
If the sum is lesser than k:update the answer with the maximum of the previous answer and the current sum.increase the left pointer.
update the answer with the maximum of the previous answer and the current sum.increase the left pointer.
update the answer with the maximum of the previous answer and the current sum.
increase the left pointer.
Else Decrease the right pointer.
C++
Python3
C#
Javascript
// CPP program for the above approach#include <bits/stdc++.h>using namespace std; // Function to find max sum less than kint maxSum(vector<int> arr, int k){         // Sort the array    sort(arr.begin(), arr.end());    int n = arr.size(), l = 0, r = n - 1, ans = 0;     // While l is less than r    while (l < r) {        if (arr[l] + arr[r] < k) {            ans = max(ans, arr[l] + arr[r]);            l++;        }        else {            r--;        }    }     return ans;} // Driver Codeint main(){    vector<int> A = { 20, 10, 30, 100, 110 };    int k = 85;     // Function Call    cout << maxSum(A, k) << endl;}
# Python program for above approach # Function to find max sum less than kdef maxSum(arr, k):         # Sort the array    arr.sort()    n,l = len(arr),0    r,ans = n - 1,0     # While l is less than r    while (l < r):        if (arr[l] + arr[r] < k):            ans = max(ans, arr[l] + arr[r])            l += 1        else:            r -= 1     return ans # Driver CodeA = [20, 10, 30, 100, 110]k = 85 # Function Callprint(maxSum(A, k)) # This code is contributed by shinjanpatra
// C# implementation of the approachusing System; class GFG{   // Function to find max sum less than kstatic int maxSum(int[] arr, int k){         // Sort the array    Array.Sort(arr);    int n = arr.Length, l = 0, r = n - 1, ans = 0;     // While l is less than r    while (l < r) {        if (arr[l] + arr[r] < k) {            ans = Math.Max(ans, arr[l] + arr[r]);            l++;        }        else {            r--;        }    }     return ans;} // Driver codepublic static void Main (){    int[] A = { 20, 10, 30, 100, 110 };    int k = 85;     // Function Call    Console.WriteLine(maxSum(A, k));}} // This code is contributed by target_2.
<script> // Javascript program for the above approach // Function to find max sum less than kfunction maxSum(arr, k){         // Sort the array    arr.sort((a,b)=>a-b);    var n = arr.length, l = 0, r = n - 1, ans = 0;     // While l is less than r    while (l < r) {        if (arr[l] + arr[r] < k) {            ans = Math.max(ans, arr[l] + arr[r]);            l++;        }        else {            r--;        }    }     return ans;} // Driver Codevar A = [20, 10, 30, 100, 110];var k = 85;// Function Calldocument.write( maxSum(A, k));  </script>
50
Time complexity: O(NlogN)
Space complexity: O(1)
vt_m
Sanjit_Prasad
arorakashish0911
muskaanjain3
divyesh072019
rutvik_56
target_2
shinjanpatra
Arrays
Searching
Sorting
Arrays
Searching
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
Binary Search
Median of two sorted arrays of different sizes
Find the index of an array element in Java
Two Pointers Technique
Count number of occurrences (or frequency) in a sorted array