- 最多能完成排序的块 II
arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。
我们最多能将数组分成多少块?
示例 1:
输入: arr = [5,4,3,2,1]
输出: 1
解释:
将数组分成2块或者更多块,都无法得到所需的结果。
题目来源https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/
思路
找到最多能完成排序的块,就是要找的非区域的最大值,并且当前区域的最大值要比下一个区域的最小值要大
可以利用单调栈来实现:
1、如果栈为空,或者数组的元素>=栈顶元素进栈;
2、如果数组元素<栈顶元素,记录最大元素,并且比较当前数组元素与栈顶元素大小如果小于则出栈更新栈中的最大的个数
3、栈中元素的个数就是块的个数
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
stack<int> st;
for(int i=0;i<arr.size();i++){
if(st.empty() || arr[i]>=st.top())
st.push(arr[i]);
else{
int max = st.top();
while(!st.empty() && arr[i]<st.top())//更新栈中最大元素的个数
st.pop();
st.push(max);
}
}
return st.size();
}
};
复杂度分析
时间复杂度O(n)
空间复杂度O(n)