GeeksforGeeks App
Open App
Browser
Continue

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

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 ``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

 `= 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

 ``

Output

`-5`

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