Open In App

Divide an array into k segments to maximize maximum of segment minimums

Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of n integers, divide it into k segments and find the maximum of the minimums of k segments. Output the maximum integer that can be obtained among all ways to segment in k subarrays.

Examples: 

Input : arr[] = {1, 2, 3, 6, 5}  
        k = 2
Output: 5
Explanation: There are many ways to create 
two segments. The optimal segments are (1, 2, 3)
and (6, 5). Minimum of both segments are 1 and 5, 
hence the maximum(1, 5) is 5. 


Input: -4 -5 -3 -2 -1 k=1
Output: -5 
Explanation: only one segment, so minimum is -5.

There will be 3 cases that need to be considered. 

  1. k >= 3: When k is greater than 2, one segment will only compose of {max element}, so that max of minimum segments will always be the max.
  2. k = 2: For k = 2 the answer is the maximum of the first and last element.
  3. k = 1: Only possible partition is one segment equal to the whole array. So the answer is the minimum value on the whole array.

Below is the implementation of the above approach 

C++




// CPP Program to find maximum value of
// maximum of minimums of k segments.
#include <bits/stdc++.h>
using namespace std;
  
// function to calculate the max of all the
// minimum segments
int maxOfSegmentMins(int a[], int n, int k)
{
    // if we have to divide it into 1 segment
    // then the min will be the answer
    if (k == 1) 
       return *min_element(a, a+n);
  
    if (k == 2) 
       return max(a[0], a[n-1]);  
     
    // If k >= 3, return maximum of all
    // elements.
    return *max_element(a, a+n);
}
  
// driver program to test the above function
int main()
{
    int a[] = { -10, -9, -8, 2, 7, -6, -5 };
    int n = sizeof(a) / sizeof(a[0]);
    int k = 2;
    cout << maxOfSegmentMins(a, n, k);
}


Java




// Java Program to find maximum 
// value of maximum of minimums
// of k segments.
import java .io.*;
import java .util.*;
  
class GFG
{
  
    // function to calculate 
    // the max of all the 
    // minimum segments
    static int maxOfSegmentMins(int []a,
                                int n, 
                                int k)
    {
          
        // if we have to divide 
        // it into 1 segment then 
        // the min will be the answer
        if (k == 1
        {
            Arrays.sort(a);
                return a[0];
        }
      
        if (k == 2
            return Math.max(a[0], 
                            a[n - 1]); 
          
        // If k >= 3, return 
        // maximum of all 
        // elements.
        return a[n - 1];
    }
      
    // Driver Code
    static public void main (String[] args)
    {
        int []a = {-10, -9, -8
                    2, 7, -6, -5};
        int n = a.length;
        int k = 2;
          
        System.out.println(
                maxOfSegmentMins(a, n, k));
    }
}
  
// This code is contributed
// by anuj_67.


Python3




# Python3 Program to find maximum value of 
# maximum of minimums of k segments.
  
# function to calculate the max of all the 
# minimum segments 
def maxOfSegmentMins(a,n,k):
  
    # if we have to divide it into 1 segment 
    # then the min will be the answer 
    if k ==1:
        return min(a)
    if k==2:
        return max(a[0],a[n-1])
  
    # If k >= 3, return maximum of all 
    #  elements. 
    return max(a)
      
# Driver code
if __name__=='__main__':
    a = [-10, -9, -8, 2, 7, -6, -5]
    n = len(a)
    k =2
    print(maxOfSegmentMins(a,n,k))
  
# This code is contributed by 
# Shrikant13


C#




// C# Program to find maximum value of
// maximum of minimums of k segments.
using System;
using System.Linq;
  
public class GFG {
  
  
    // function to calculate the max
    // of all the minimum segments
    static int maxOfSegmentMins(int []a,
                             int n, int k)
    {
          
        // if we have to divide it into 1
        // segment then the min will be
        // the answer
        if (k == 1) 
            return a.Min();
      
        if (k == 2) 
            return Math.Max(a[0], a[n - 1]); 
          
        // If k >= 3, return maximum of
        // all elements.
        return a.Max();
    }
      
    // Driver function
    static public void Main ()
    {
        int []a = { -10, -9, -8, 2, 7,
                                 -6, -5 };
        int n = a.Length;
        int k = 2;
          
        Console.WriteLine(
                  maxOfSegmentMins(a, n, k));
    }
}
  
// This code is contributed by vt_m.


PHP




<?php
// PHP Program to find maximum
// value of maximum of minimums
// of k segments.
  
  
// function to calculate
// the max of all the
// minimum segments
function maxOfSegmentMins($a, $n, $k)
{
    // if we have to divide 
    // it into 1 segment then
    // the min will be the answer
    if ($k == 1) 
    return min($a);
  
    if ($k == 2) 
    return max($a[0], 
               $a[$n - 1]); 
      
    // If k >= 3, return 
    // maximum of all elements.
    return max($a);
}
  
// Driver Code
$a = array(-10, -9, -8, 
            2, 7, -6, -5);
$n = count($a);
$k = 2;
echo maxOfSegmentMins($a, $n, $k);
  
// This code is contributed by vits.
?>


Javascript




<script>
// javascript Program to find maximum 
// value of maximum of minimums
// of k segments.    
// function to calculate
    // the max of all the
    // minimum segments
    function maxOfSegmentMins(a , n , k)
    {
  
        // if we have to divide
        // it into 1 segment then
        // the min will be the answer
        if (k == 1) {
            a.sort();
            return a[0];
        }
  
        if (k == 2)
            return Math.max(a[0], a[n - 1]);
  
        // If k >= 3, return
        // maximum of all
        // elements.
        return a[n - 1];
    }
  
    // Driver Code
        var a = [ -10, -9, -8, 2, 7, -6, -5 ];
        var n = a.length;
        var k = 2;
  
        document.write(maxOfSegmentMins(a, n, k));
  
// This code is contributed by Rajput-Ji
</script>


Output

-5

Time complexity: O(n) 
Auxiliary Space: O(1) 

 



Last Updated : 18 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads