题目描述:
给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:
- left 中的每个元素都小于或等于 right 中的每个元素。
- left 和 right 都是非空的。
- left 的长度要尽可能小。
在完成这样的分组后返回 left 的长度 。用例可以保证存在这样的划分方法。
示例1:
输入:nums = [5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]
示例2:
输入:nums = [1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]
提示:
- 2 <= nums.length <= 105
- 0 <= nums[i] <= 106
- 可以保证至少有一种方法能够按题目所描述的那样对 nums 进行划分。
解题思路:
对于题目要求,只需找到前缀数组的最大值比后缀数组的最小值小即可
如[5, 0, 3, 8, 6],max([5, 0, 3]) < min([8, 6])
代码:
class Solution {
public:
int partitionDisjoint(vector<int> &nums) {
int n = nums.size();
int right[n];
right[n - 1] = nums[n - 1];
for (int i = n - 2; i > 0; i--)
right[i] = min(right[i + 1], nums[i]);
int m_left = nums[0];
for (int i = 0; i < n - 1; i++) {
m_left = max(m_left, nums[i]);
if (m_left <= right[i + 1])
return i + 1;
}
return 0;
}
};
提交结果: