先从左到右遍历一次数组,记录当前位置左侧的最大值;再从右到左遍历一次数组,记录当前位置右侧的最小值。
那么第一个左侧最大值小于等于右侧最小值的位置即是划分的位置。
class Solution {
public:
int partitionDisjoint(vector<int>& nums) {
int n = nums.size();
vector<int> leftMax(n), rightMin(n);
leftMax[0] = nums[0];
rightMin[n - 1] = nums[n - 1];
for (int i = 1; i < n; i++) {
leftMax[i] = max(nums[i], leftMax[i - 1]);
}
for (int i = n - 2; i >= 0; i--) {
rightMin[i] = min(nums[i], rightMin[i + 1]);
}
for (int i = 0; i < n - 1; i++) {
if (leftMax[i] <= rightMin[i + 1]) {
return i + 1;
}
}
return 0;
}
};