Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App
geeksforgeeks
Browser
Continue

Related Articles

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

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

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) 

This article is contributed by Raja Vikramaditya. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 


My Personal Notes arrow_drop_up
Last Updated : 15 Dec, 2022
Like Article
Save Article
Similar Reads
Related Tutorials