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 array long 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 Code int main() { vector< long long > vtr = { 3, 1, 4, 1, 5, 9 }; int n = vtr.size(); cout << FindMaxDif(vtr, n); return 0; } |
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 Code static 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 |
Output:
1
Time Complexity: O(NlogN)
Auxiliary Space: O(N)