Maximize difference between the Sum of the two halves of the Array after removal of N elements

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 |
Output:Â
1
Â
Time Complexity: O(NlogN)
Auxiliary Space: O(N)
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



