C++ 中将数组划分成不相交区间
假设我们有一个数组 A,我们需要将其划分为两个子数组 left 和 right,使得:
left 子数组中的每个元素都小于或等于 right 子数组中的每个元素。
left 和 right 子数组都不为空。
left 子数组具有尽可能小的尺寸。
我们需要找到这种划分后 left 的长度。保证存在这样的划分。
例如,如果输入是 [5, 0, 3, 8, 6],则输出将是 3,因为 left 数组将是 [5, 0, 3],而 right 子数组将是 [8, 6]。
为了解决这个问题,我们将遵循以下步骤:
n := A 的大小,创建一个大小为 n 的数组 maxx
minVal := A 的最后一个元素
maxx[0] := A[0]
对于 i 从 1 到 n – 1
maxx[i] := A[i] 和 A[i – 1] 中的最大值
ans := A 的大小 – 1
对于 i 从 n – 1 到 1
minVal := minVal 和 A[i] 中的最小值
如果 minVal >= max[i – 1],则 ans := i
返回 ans
示例
让我们看看以下实现以更好地理解:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int partitionDisjoint(vector <int>& A) {
int n = A.size();
vector <int> maxx(n);
int minVal = A[n - 1];
maxx[0] = A[0];
for(int i = 1; i < n; i++){
maxx[i] = max(A[i], maxx[i - 1]);
}
int ans = A.size() - 1;
for(int i = n - 1; i >= 1; i--){
minVal = min(minVal, A[i]);
if(minVal >= maxx[i - 1]){
ans = i;
}
}
return ans;
}
};
main(){
vector<int> v1 = {5,0,3,8,6};
Solution ob;
cout << (ob.partitionDisjoint(v1));
}输入
[5,0,3,8,6]
输出
3
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP