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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

There will be 3 cases that need to be considered.

1. k >= 3: When k is greater then 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. ` `?> `

Output:

`-5`

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

My Personal Notes arrow_drop_up

Improved By : vt_m, shrikanth13

Article Tags :
Practice Tags :

3

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.