Divide an array into k segments to maximize maximum of segment minimums
Last Updated :
18 Sep, 2023
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.
- 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.
- k = 2: For k = 2 the answer is the maximum of the first and last element.
- 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++
#include <bits/stdc++.h>
using namespace std;
int maxOfSegmentMins( int a[], int n, int k)
{
if (k == 1)
return *min_element(a, a+n);
if (k == 2)
return max(a[0], a[n-1]);
return *max_element(a, a+n);
}
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
import java .io.*;
import java .util.*;
class GFG
{
static int maxOfSegmentMins( int []a,
int n,
int k)
{
if (k == 1 )
{
Arrays.sort(a);
return a[ 0 ];
}
if (k == 2 )
return Math.max(a[ 0 ],
a[n - 1 ]);
return a[n - 1 ];
}
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));
}
}
|
Python3
def maxOfSegmentMins(a,n,k):
if k = = 1 :
return min (a)
if k = = 2 :
return max (a[ 0 ],a[n - 1 ])
return max (a)
if __name__ = = '__main__' :
a = [ - 10 , - 9 , - 8 , 2 , 7 , - 6 , - 5 ]
n = len (a)
k = 2
print (maxOfSegmentMins(a,n,k))
|
C#
using System;
using System.Linq;
public class GFG {
static int maxOfSegmentMins( int []a,
int n, int k)
{
if (k == 1)
return a.Min();
if (k == 2)
return Math.Max(a[0], a[n - 1]);
return a.Max();
}
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));
}
}
|
PHP
<?php
function maxOfSegmentMins( $a , $n , $k )
{
if ( $k == 1)
return min( $a );
if ( $k == 2)
return max( $a [0],
$a [ $n - 1]);
return max( $a );
}
$a = array (-10, -9, -8,
2, 7, -6, -5);
$n = count ( $a );
$k = 2;
echo maxOfSegmentMins( $a , $n , $k );
?>
|
Javascript
<script>
function maxOfSegmentMins(a , n , k)
{
if (k == 1) {
a.sort();
return a[0];
}
if (k == 2)
return Math.max(a[0], a[n - 1]);
return a[n - 1];
}
var a = [ -10, -9, -8, 2, 7, -6, -5 ];
var n = a.length;
var k = 2;
document.write(maxOfSegmentMins(a, n, k));
</script>
|
Time complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...