单调栈+贪心:
当某排序块 num<mmax :将此排序块[A]与 num 合并,形成新排序块[A | num],最大值仍为 mmax ;
当某排序块 num>=mmax :原排序块保留,并新加排序块 [num] 。
思路:
在遍历过程中动态更新,更新的规则是1. 如果这个数n比前面分块的最大值还大,说明前面的分块没问题,这个当作新的一个分块
2. 如果这个数n比前面分块的最大值小,说明这个数要放到前面某个分块x里,具体的
3. 应该放到分块x最大值比n小的下一个分块,也就是和步骤1一样,n要比前面分块的最大值还大
4. 这样从最后一个分块到分块x之间的分块要合并成一个
由于我们发现规律:只要用到每个分块的最大值,且这个分块的最大值也应该是单调递增的
所以可以使用一个单调递增的栈来存储每个分块的最大值,分块最大值的个数也就是分块的个数
细节:注意合并之后的分块的最大值应该是遇到n之前的分块的最大值,所以要对他进行记录,他还是合并n之后的分块的最大值
def maxChunksToSorted(self, arr):
"""
:type arr: List[int]
:rtype: int
"""
stack = [-1]
for i in arr:
if i >= stack[-1]:
stack.append(i)
else:
mmax = stack.pop()
while stack and i < stack[-1]:
stack.pop()
stack.append(mmax)
return len(stack)-1