参考资料:
问题描述
arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。
我们最多能将数组分成多少块?
示例
思路
为了满足题目中的要求,必须保证后一个块中的每一个元素均>=
前一个块中的每一个元素。假设我们对于数组中的arr[0]
~arr[i-1]
已经分好块,对于arr[i]
,有以下两种情况:
arr[i]
大于等于最后一个块的最大值,这时,直接把arr[i]
当作一个新的块即可。arr[i]
小于最后一个块的最大值,这时,要想满足题目要求,就必须要将arr[i]
并入到最后一个块中。但是,并入arr[i]
后的最后一个块不满足“每一个元素均>=
前一个块中的每一个元素”的条件,则需要将最后一个块并入到前一个块中。以此类推,直到满足条件为止。
这一过程可以借助单调栈实现。单调栈保存的是每个块中元素的最大值,从栈底到栈顶按照升序排序。具体实现见代码。
代码
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
stack<int> s;
s.push(arr[0]);
for(int i=1;i<arr.size();i++){
if(arr[i]>=s.top()) s.push(arr[i]); //情况1
else{ //情况2
int M = s.top();
while(s.empty()!=1&&s.top()>arr[i]) s.pop();
s.push(M);
}
}
return s.size();
}
};