最多能完成排序的块 II
00 min
2024-7-22
2024-7-22
type
status
date
slug
summary
tags
category
icon
password
 

最多能完成排序的块 II

 
给你一个整数数组 arr 。
将 arr 分割成若干  ,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。
返回能将数组分成的最多块数?
示例 1:
示例 2:
提示:
  • 1 <= arr.length <= 2000
  • 0 <= arr[i] <= 108

题解

 
对于已经分好块的数组,若块数大于 1,则可以得到以下结论:右边的块的所有数字均大于或等于左边的块的所有数字。考虑这个问题:对于已经分好块的数组,若在其末尾添加一个数字,如何求得新数组的分块方式?
新添加的数字可能会改变原数组的分块方式。如果新添加的数字大于或等于原数组最后一个块的最大值,则这个新添加的数字可以自己形成一个块。如果新添加的数字小于原数组最后一个块的最大值,则它必须融入最后一个块。如果它大于或等于原数组倒数第二个块(如果有)的最大值,那么这个过程可以停止,新数组的分块方式已经求得。否则,它将继续融合原数组倒数第二个块,直到遇到一个块,使得该块的最大值小于或等于这个新添加的数,或者这个数字已经融合了所有块。
上述分析过程中,我们只用到了块的最大值来进行比较,比较过程又是从右到左,符合栈的思想,因此可以用类似单调栈的数据结构来存储块的最大值。
 
 
复杂度分析
时间复杂度:O(n),其中 n 是输入数组 arr 的长度。需要遍历一遍数组,入栈的操作最多为 n 次。
空间复杂度:O(n)。栈的长度最多为 n

附录

上一篇
最长回文子串
下一篇
超级回文数