Thursday, July 4, 2024
HomeData ModellingData Structure & AlgorithmMinimize the maximum difference of any pair by doubling odd elements and...

Minimize the maximum difference of any pair by doubling odd elements and reducing even elements by half

Given an array arr[] consisting of N positive integers, the task is to minimize the maximum difference between any pair of array elements by multiplying any odd array element by 2 and dividing any even array element by 2.

Examples:

Input: arr[] = {4, 1, 5, 20, 3}
Output: 3
Explanation:
Operation 1: Multiplying arr[1] by 2 modifies arr[] to {4, 2, 5, 20, 3}.
Operation 2: Dividing arr[3] by 2 modifies arr[] to {4, 2, 5, 10, 3}.
Operation 3: Dividing arr[3] by 2 modifies arr[] to {4, 2, 5, 5, 3}.
Therefore, the minimum of the maximum difference of any pair in the array = 5 – 2 = 3.

Input: arr[] = {1, 2, 5, 9}
Output: 7
Explanation:
Operation 1: Multiplying arr[0] by 2 modifies arr[] to { 2, 2, 5, 9 }
Operation 2: Multiplying arr[2] by 2 modifies arr[] to {2, 2, 10, 9 }
Therefore, the minimum of the maximum difference of any pair in the array = 9 – 2 = 7.

Approach: Follow the steps below to solve the given problem:

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to minimize the maximum
// difference between any pair of elements
// of the array by the given operations
int minimumMaxDiff(vector<int>& nums)
{
    set<int> s;
 
    // Traverse the array
    for (int i = 0; i < nums.size(); i++) {
 
        // If current element is even
        if (nums[i] % 2 == 0)
 
            // Insert it into even
            s.insert(nums[i]);
 
        // Otherwise
        else
 
            // Make it even by multiplying
            // by 2 and insert it into set
            s.insert(nums[i] * 2);
    }
 
    // Calculate difference between first
    // and the last element of the set
    int res = *s.rbegin() - *s.begin();
 
    // Iterate until difference is minimized
    while (*s.rbegin() % 2 == 0) {
        int x = *s.rbegin();
 
        // Erase the current element
        s.erase(x);
 
        // Reduce current element by half
        // and insert it into the Set
        s.insert(x / 2);
 
        // Update difference
        res = min(res, *s.rbegin()
                           - *s.begin());
    }
 
    // Return the resultant difference
    return res;
}
 
// Driver Code
int main()
{
    vector<int> arr = { 1, 2, 5, 9 };
    cout << minimumMaxDiff(arr);
}


Java




// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG
{
 
  // Function to minimize the maximum
  // difference between any pair of elements
  // of the array by the given operations
  static int minimumMaxDiff(int[] nums)
  {
    TreeSet<Integer> s = new TreeSet<Integer>();
 
    // Traverse the array
    for (int i = 0; i < nums.length; i++)
    {
 
      // If current element is even
      if (nums[i] % 2 == 0)
 
        // Insert it into even
        s.add(nums[i]);
 
      // Otherwise
      else
 
        // Make it even by multiplying
        // by 2 and insert it into set
        s.add(nums[i] * 2);
    }
 
    // Calculate difference between first
    // and the last element of the set
    int res = s.last() - s.first();
 
    // Iterate until difference is minimized
    while (s.last() % 2 == 0)
    {
      int x = s.last();
 
      // Erase the current element
      s.remove(x);
 
      // Reduce current element by half
      // and insert it into the Set
      s.add(x / 2);
 
      // Update difference
      res = Math.min(res, s.last() - s.first());
    }
 
    // Return the resultant difference
    return res;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int[] arr = new int[] { 1, 2, 5, 9 };
    System.out.print(minimumMaxDiff(arr));
  }
}
 
// This code is contributed by jithin


Python3




# Python3 program for the above approach
 
# Function to minimize the maximum
# difference between any pair of elements
# of the array by the given operations
def minimumMaxDiff(nums):
     
    s = {}
 
    # Traverse the array
    for i in range(len(nums)):
 
        # If current element is even
        if (nums[i] % 2 == 0):
 
            # Insert it into even
            s[nums[i]] = 1
 
        # Otherwise
        else:
 
            # Make it even by multiplying
            # by 2 and insert it into set
            s[nums[i] * 2] = 1
 
    # Calculate difference between first
    # and the last element of the set
    sr = list(s.keys())
    res = sr[-1] - sr[0]
 
    # Iterate until difference is minimized
    while (list(s.keys())[-1] % 2 == 0):
        r = list(s.keys())
        x = r[-1]
 
        # Erase the current element
        del s[x]
 
        # Reduce current element by half
        # and insert it into the Set
        s[x // 2] = 1
 
        rr = list(s.keys())
 
        # Update difference
        res = min(res, rr[-1] - r[0])
 
    # Return the resultant difference
    return res
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 1, 2, 5, 9 ]
     
    print (minimumMaxDiff(arr))
     
# This code is contributed by mohit kumar 29


C#




// C# program for the above approach
using System;
using System.Collections.Generic;
using System.Linq; 
 
class GFG
{
 
  // Function to minimize the maximum
  // difference between any pair of elements
  // of the array by the given operations
  static int minimumMaxDiff(int[] nums)
  {
    HashSet<int> s = new HashSet<int>();
 
    // Traverse the array
    for (int i = 0; i < nums.Length; i++) {
 
      // If current element is even
      if (nums[i] % 2 == 0)
 
        // Insert it into even
        s.Add(nums[i]);
 
      // Otherwise
      else
 
        // Make it even by multiplying
        // by 2 and insert it into set
        s.Add(nums[i] * 2);
    }
 
    // Calculate difference between first
    // and the last element of the set
    int res = s.Last() - s.First();
 
    // Iterate until difference is minimized
    while (s.Last() % 2 == 0) {
      int x = s.Last();
 
      // Erase the current element
      s.Remove(x);
 
      // Reduce current element by half
      // and insert it into the Set
      s.Add(x / 2);
 
      // Update difference
      res = Math.Min(res, s.Last() - s.First());
    }
 
    // Return the resultant difference
    return res;
  }
 
  // Driver code
  static public void Main()
  {
    int[] arr = new int[] { 1, 2, 5, 9 };
    Console.WriteLine(minimumMaxDiff(arr));
  }
}
 
// This code is contributed by Dharanendra L V


Javascript




<script>
 
// JavaScript program for the above approach
 
// Function to minimize the maximum
// difference between any pair of elements
// of the array by the given operations
function minimumMaxDiff( nums)
{
    var s = new Set();
 
    // Traverse the array
    for (var i = 0; i < nums.length; i++) {
 
        // If current element is even
        if (nums[i] % 2 == 0)
 
            // Insert it into even
            s.add(nums[i]);
 
        // Otherwise
        else
 
            // Make it even by multiplying
            // by 2 and insert it into set
            s.add(nums[i] * 2);
    }
 
    // Calculate difference between first
    // and the last element of the set
    var tmp = [...s].sort((a,b)=>a-b)
    var res = tmp[tmp.length-1] - tmp[0];
 
    // Iterate until difference is minimized
    while (tmp[tmp.length-1] % 2 == 0) {
        var x = tmp[tmp.length-1];
 
        // Erase the current element
        s.delete(x);
 
        // Reduce current element by half
        // and insert it into the Set
        s.add(parseInt(x / 2));
        tmp = [...s].sort((a,b)=>a-b)
         
        // Update difference
        res = Math.min(res,tmp[tmp.length-1]
                           - tmp[0]);
    }
 
    // Return the resultant difference
    return res;
}
 
// Driver Code
var arr = [1, 2, 5, 9];
document.write( minimumMaxDiff(arr));
 
 
</script>


Output: 

7

 

Time Complexity: O(N*log N)
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 neveropen!

Shaida Kate Naidoo
am passionate about learning the latest technologies available to developers in either a Front End or Back End capacity. I enjoy creating applications that are well designed and responsive, in addition to being user friendly. I thrive in fast paced environments. With a diverse educational and work experience background, I excel at collaborating with teams both local and international. A versatile developer with interests in Software Development and Software Engineering. I consider myself to be adaptable and a self motivated learner. I am interested in new programming technologies, and continuous self improvement.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments