Given an integer N and array arr[] consisting of 3 * N integers, the task is to find the maximum difference between first half and second half of the array after the removal of exactly N elements from the array.
Examples:
Input: N = 2, arr[] = {3, 1, 4, 1, 5, 9}
Output: 1
Explanation:
Removal of arr[1] and arr[5] from the array maximizes the difference = (3 + 4) – (1 + 5) = 7 – 6 = 1.Input: N = 1, arr[] = {1, 2, 3}
Output: -1
Approach:Â
Follow the steps given below to solve the problem
- Traverse the array from the beginning and keep updating the sum of the largest N elements from the beginning of the array.
- Similarly, keep updating the sum of the smallest N elements from the end of the array.
- Traverse these sums and calculate the differences at each point and update the maximum difference obtained.
- Print the maximum difference obtained.
Below is the implementation of the above approach:Â
C++
// C++ Program to implement// the above approach#include <bits/stdc++.h>using namespace std;Â
// Function to print the maximum difference// possible between the two halves of the arraylong long FindMaxDif(vector<long long> a, int m){Â Â Â Â int n = m / 3;Â
    vector<long long> l(m + 5), r(m + 5);Â
    // Stores n maximum values from the start    multiset<long long> s;Â
    for (int i = 1; i <= m; i++) {Â
        // Insert first n elements        if (i <= n) {Â
            // Update sum of largest n            // elements from left            l[i] = a[i - 1] + l[i - 1];            s.insert(a[i - 1]);        }Â
        // For the remaining elements        else {            l[i] = l[i - 1];Â
            // Obtain minimum value            // in the set            long long d = *s.begin();Â
            // Insert only if it is greater            // than minimum value            if (a[i - 1] > d) {Â
                // Update sum from left                l[i] -= d;                l[i] += a[i - 1];Â
                // Remove the minimum                s.erase(s.find(d));Â
                // Insert the current element                s.insert(a[i - 1]);            }        }    }Â
    // Clear the set    s.clear();Â
    // Store n minimum elements from the end    for (int i = m; i >= 1; i--) {Â
        // Insert the last n elements        if (i >= m - n + 1) {Â
            // Update sum of smallest n            // elements from right            r[i] = a[i - 1] + r[i + 1];            s.insert(a[i - 1]);        }Â
        // For the remaining elements        else {Â
            r[i] = r[i + 1];Â
            // Obtain the minimum            long long d = *s.rbegin();Â
            // Insert only if it is smaller            // than maximum value            if (a[i - 1] < d) {Â
                // Update sum from right                r[i] -= d;                r[i] += a[i - 1];Â
                // Remove the minimum                s.erase(s.find(d));Â
                // Insert the new element                s.insert(a[i - 1]);            }        }    }Â
    long long ans = -9e18L;Â
    for (int i = n; i <= m - n; i++) {Â
        // Compare the difference and        // store the maximum        ans = max(ans, l[i] - r[i + 1]);    }Â
    // Return the maximum    // possible difference    return ans;}Â
// Driver Codeint main(){Â
    vector<long long> vtr = { 3, 1, 4, 1, 5, 9 };    int n = vtr.size();Â
    cout << FindMaxDif(vtr, n);Â
    return 0;} |
Java
// Java Program to implement// the above approachimport java.io.*;import java.util.*;Â
class GFG {Â
  // Function to print the maximum difference   // possible between the two halves of the array   static Long FindMaxDif(List<Long> a, int m)   {     int n = m / 3; Â
    Long[] l = new Long[m + 5];    Long[] r = new Long[m + 5];Â
    for(int i = 0; i < m+5; i++) {Â
      l[i] = r[i] = 0L;    }Â
    // Stores n maximum values from the start     List<Long> s = new ArrayList<Long>(); Â
    for(int i = 1; i <= m; i++)     { Â
      // Insert first n elements       if (i <= n)       { Â
        // Update sum of largest n         // elements from left         l[i] = a.get(i - 1) + l[i - 1];         s.add(a.get(i - 1));       } Â
      // For the remaining elements       else      {         l[i] = l[i - 1]; Â
        Collections.sort(s);Â
        // Obtain minimum value         // in the set         Long d = s.get(0); Â
        // Insert only if it is greater         // than minimum value         if (a.get(i - 1) > d)         {Â
          // Update sum from left           l[i] -= d;           l[i] += a.get(i - 1); Â
          // Remove the minimum           s.remove(d); Â
          // Insert the current element           s.add(a.get(i - 1));         }       }     } Â
    // Clear the set     s.clear(); Â
    // Store n minimum elements from the end     for(int i = m; i >= 1; i--)     { Â
      // Insert the last n elements       if (i >= m - n + 1)      { Â
        // Update sum of smallest n         // elements from right         r[i] = a.get(i - 1) + r[i + 1];         s.add(a.get(i - 1));       } Â
      // For the remaining elements       else      {         r[i] = r[i + 1]; Â
        Collections.sort(s);Â
        // Obtain the minimum         Long d = s.get(s.size() - 1); Â
        // Insert only if it is smaller         // than maximum value         if (a.get(i - 1) < d)        { Â
          // Update sum from right           r[i] -= d;           r[i] += a.get(i - 1); Â
          // Remove the minimum           s.remove(d); Â
          // Insert the new element           s.add(a.get(i - 1));         }       }     } Â
    Long ans = Long.MIN_VALUE; Â
    for(int i = n; i <= m - n; i++)     { Â
      // Compare the difference and       // store the maximum       ans = Math.max(ans, l[i] - r[i + 1]);     } Â
    // Return the maximum     // possible difference     return ans;   } Â
  // Driver Code  public static void main (String[] args) {Â
    List<Long> vtr = new ArrayList<Long>(      Arrays.asList(3L, 1L, 4L, 1L, 5L, 9L));     int n = vtr.size(); Â
    System.out.println(FindMaxDif(vtr, n));  }}Â
// This code is contributed by Dharanendra L V. |
Python3
# Python3 Program to implement # the above approach Â
# Function to print the maximum difference # possible between the two halves of the array def FindMaxDif(a, m) : Â
    n = m // 3Â
    l = [0] * (m + 5)    r = [0] * (m + 5)Â
    # Stores n maximum values from the start     s = [] Â
    for i in range(1, m + 1) :Â
        # Insert first n elements         if (i <= n) :Â
            # Update sum of largest n             # elements from left             l[i] = a[i - 1] + l[i - 1]            s.append(a[i - 1])Â
        # For the remaining elements         else :            l[i] = l[i - 1] Â
            # Obtain minimum value             # in the set             s.sort()            d = s[0] Â
            # Insert only if it is greater             # than minimum value             if (a[i - 1] > d) :Â
                # Update sum from left                 l[i] -= d                l[i] += a[i - 1]Â
                # Remove the minimum                 s.remove(d)Â
                # Insert the current element                 s.append(a[i - 1])Â
    # Clear the set     s.clear()Â
    # Store n minimum elements from the end     for i in range(m, 0, -1) :Â
        # Insert the last n elements         if (i >= m - n + 1) : Â
            # Update sum of smallest n             # elements from right             r[i] = a[i - 1] + r[i + 1]            s.append(a[i - 1])Â
        # For the remaining elements         else : Â
            r[i] = r[i + 1]            s.sort()                         # Obtain the minimum             d = s[-1]Â
            # Insert only if it is smaller             # than maximum value             if (a[i - 1] < d) :Â
                # Update sum from right                 r[i] -= d                 r[i] += a[i - 1]Â
                # Remove the minimum                 s.remove(d) Â
                # Insert the new element                 s.append(a[i - 1])Â
    ans = -9e18Â
    for i in range(n, m - n + 1) : Â
        # Compare the difference and         # store the maximum         ans = max(ans, l[i] - r[i + 1])Â
    # Return the maximum     # possible difference     return ansÂ
# Driver code vtr = [ 3, 1, 4, 1, 5, 9 ]n = len(vtr) Â
print(FindMaxDif(vtr, n))Â
# This code is contributed by divyesh072019 |
C#
// C# program to implement // the above approach using System;using System.Collections.Generic;Â
class GFG{     // Function to print the maximum difference // possible between the two halves of the array static long FindMaxDif(List<long> a, int m) {     int n = m / 3;          long[] l = new long[m + 5];    long[] r = new long[m + 5];       // Stores n maximum values from the start     List<long> s = new List<long>();        for(int i = 1; i <= m; i++)     {                  // Insert first n elements         if (i <= n)         {                          // Update sum of largest n             // elements from left             l[i] = a[i - 1] + l[i - 1];             s.Add(a[i - 1]);         }                  // For the remaining elements         else        {             l[i] = l[i - 1];                          s.Sort();                         // Obtain minimum value             // in the set             long d = s[0];                // Insert only if it is greater             // than minimum value             if (a[i - 1] > d)             {                                 // Update sum from left                 l[i] -= d;                 l[i] += a[i - 1];                    // Remove the minimum                 s.Remove(d);                    // Insert the current element                 s.Add(a[i - 1]);             }         }     }        // Clear the set     s.Clear();        // Store n minimum elements from the end     for(int i = m; i >= 1; i--)     {                  // Insert the last n elements         if (i >= m - n + 1)        {                          // Update sum of smallest n             // elements from right             r[i] = a[i - 1] + r[i + 1];             s.Add(a[i - 1]);         }            // For the remaining elements         else        {             r[i] = r[i + 1];                          s.Sort();                         // Obtain the minimum             long d = s[s.Count - 1];                // Insert only if it is smaller             // than maximum value             if (a[i - 1] < d)            {                                  // Update sum from right                 r[i] -= d;                 r[i] += a[i - 1];                    // Remove the minimum                 s.Remove(d);                    // Insert the new element                 s.Add(a[i - 1]);             }         }     }        long ans = (long)(-9e18);        for(int i = n; i <= m - n; i++)     {                  // Compare the difference and         // store the maximum         ans = Math.Max(ans, l[i] - r[i + 1]);     }        // Return the maximum     // possible difference     return ans; } Â
// Driver Codestatic void Main() {Â Â Â Â List<long> vtr = new List<long>(Â Â Â Â Â Â Â Â new long[]{ 3, 1, 4, 1, 5, 9 }); Â Â Â Â int n = vtr.Count; Â Â Â Â Â Â Â Â Â Console.Write(FindMaxDif(vtr, n));}}Â
// This code is contributed by divyeshrabadiya07 |
Javascript
// JS Program to implement // the above approach Â
// Function to print the maximum difference // possible between the two halves of the array function FindMaxDif(a, m) {Â
    let n = Math.floor(m / 3)         let l = new Array(m + 5).fill(0)    let r = new Array(m + 5).fill(0)         // Stores n maximum values from the start     let s = []          let dÂ
    for (var i = 1; i < m + 1; i++)    {        // Insert first n elements         if (i <= n)        {            // Update sum of largest n             // elements from left             l[i] = a[i - 1] + l[i - 1]            s.push(a[i - 1])        }Â
        // For the remaining elements         else        {            l[i] = l[i - 1]Â
             Â
            // Obtain minimum value             // in the set             s.sort(function(a, b) { return a - b})            d = s[0] Â
            // Insert only if it is greater             // than minimum value             if (a[i - 1] > d)            {                // Update sum from left                 l[i] -= d                l[i] += a[i - 1]Â
                // Remove the minimum                 let ind = s.indexOf(d)                s.splice(ind, 1)Â
                // Insert the current element                 s.push(a[i - 1])            }        }    }     Â
    // Clear the set     s = []Â
    // Store n minimum elements from the end     for (var i = m; i > 0; i--)    {Â
        // Insert the last n elements         if (i >= m - n + 1)         {            // Update sum of smallest n             // elements from right             r[i] = a[i - 1] + r[i + 1]            s.push(a[i - 1])        }        // For the remaining elements         else        {            r[i] = r[i + 1]            s.sort(function(a, b) { return a - b})                         // Obtain the minimum             d = s[s.length -1]Â
            // Insert only if it is smaller             // than maximum value             if (a[i - 1] < d)            {                // Update sum from right                 r[i] -= d                 r[i] += a[i - 1]Â
                // Remove the minimum                 let ind = s.indexOf(d)                s.splice(ind, 1)Â
                // Insert the new element                 s.push(a[i - 1])            }        }    }              ans = -100000000Â
    for (var i = n; i < m - n + 1; i++) Â
        // Compare the difference and         // store the maximum         ans = Math.max(ans, l[i] - r[i + 1])Â
    // Return the maximum     // possible difference     return ans}Â
// Driver code let vtr = [ 3, 1, 4, 1, 5, 9 ]n = vtr.length Â
console.log(FindMaxDif(vtr, n))Â
// This code is contributed by phasing17 |
1
Â
Time Complexity: O(NlogN)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Information to that Topic: geeksforgeeks.org/maximize-difference-between-the-sum-of-the-two-halves-of-the-array-after-removal-of-n-elements/ […]
… [Trackback]
[…] Read More Information here to that Topic: geeksforgeeks.org/maximize-difference-between-the-sum-of-the-two-halves-of-the-array-after-removal-of-n-elements/ […]