📜  将数组划分为k个片段,以最大化片段最小值的最大值

📅  最后修改于: 2021-05-04 10:52:29             🧑  作者: Mango

给定一个由n个整数组成的数组,请将其划分为k个分段,并找到k个分段的最小值中的最大值。输出在分割k个子数组的所有方式中可以获得的最大整数。

例子:

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.

将有3种情况需要考虑。

  1. k> = 3:当k大于2时,一个段将仅由{max element}组成,因此最小段的最大值将始终为max。
  2. k = 2:对于k = 2,答案是第一个元素和最后一个元素的最大值。
  3. k = 1:只有可能的分区是等于整个数组的一个段。因此,答案是整个阵列上的最小值。

下面是上述方法的实现

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.
?>


输出:

-5

时间复杂度: O(n)
辅助空间: O(1)