C++中求K个连续子数组的最小值中的最大值
任务是将数组arr[]分成K个连续的子数组,并找到K个连续子数组的最小值中的最大可能值。
输入
arr[]={2,8,4,3,9,1,5}, K=3输出
9
解释 − 可以创建的3个连续子数组是:{2, 8, 4, 3},{9}和{1, 5}
这些数组中的最小值是:(2, 9, 1)
这三个值中的最大值是9。
输入
arr[] = { 8, 4, 1, 9, 11}, K=1输出
11
下面程序中使用的步骤如下
如果我们看一下任务,它可以分为3种情况:K=1,k=2和k>=3。
情况1 − K=1
当k=1时,子数组等于数组本身,因此数组中的最小值将是输出。
情况2 − K=2
这是一个棘手的情况。在这种情况下,我们将不得不创建两个数组,它们将包含前缀最小值和后缀最小值,因为数组只能分成两部分。然后,对于数组的每个元素,我们将执行以下操作:
MaxValue = max(MaxValue, max(i处的前缀最小值, i+1处的后缀最大值))
示例
#include <bits/stdc++.h>
using namespace std;
/* Function to find the maximum possible value
of the maximum of minimum of K sub-arrays*/
int Max(const int* arr, int size, int K){
dint Max;
int Min;
//Obtain maximum and minimum
for (int i = 0; i < size; i++){
Min = min(Min, arr[i]);
Max = max(Max, arr[i]);
}
//When K=1, return minimum value
if (K == 1){
return Min;
}
//When K>=3, return maximum value
else if (K >= 3){
return Max;
}
/*When K=2 then make prefix and suffix minimums*/
else{
// Arrays to store prefix and suffix minimums
int Left[size], Right[size];
Left[0] = arr[0];
Right[size - 1] = arr[size - 1];
// Prefix minimum
for (int i = 1; i < size; i++){
Left[i] = min(Left[i - 1], arr[i]);
}
// Suffix minimum
for (int i = size - 2; i >= 0; i--){
Right[i] = min(Right[i + 1], arr[i]);
}
int MaxValue=INT_MIN;
// Get the maximum possible value
for (int i = 0; i < size - 1; i++){
MaxValue = max(MaxValue, max(Left[i], Right[i + 1]));
}
return MaxValue;
}
}
int main(){
int arr[] = {9,4,12,5,6,11};
int size = sizeof(arr) / sizeof(arr[0]);
int K = 2;
cout<<"Maximize the maximum among minimum of K consecutive sub-arrays is: "<<Max(arr, size, K);
return 0;
}输出
如果我们运行上面的代码,我们将得到以下输出:
Maximize the maximum among minimum of K consecutive sub-arrays is: 11
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP