leetcode768. 最多能完成排序的块 II

单调栈+贪心:
当某排序块 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值