题目链接:点击跳转
思路
方法一、贪心
这题的意思很简单,意思是需要分多少段连续的序列,使每段序列都排序,最后排序完整体大的序列也是排序完的状态。
例如:[1, 0, 2, 3, 4]可以分成[1,0]、[2]、[3]、[4]四段序列,排序完整合就是一个排序完的状态[0, 1, 2, 3, 4]的序列。
需要怎么分割序列才是个问题,题目其实给了提示因为序列里的数只能是[0, n-1]所以选择[l, r] 连续的序列中的数一定是 [l, r] 这段区间的数字,所以我们只需要遍历数组,去找这段区间内最大的数字,即边界值r,因为他才是决定边界的数字,每次我们到达了r这个位置就表示下一段区间。
代码示例
func maxChunksToSorted(arr []int) int { ans, idx := 0, 0 for i := 0; i < len(arr); i++ { idx = max(idx, arr[i]) if idx == i { ans++ } } return ans } func max(a, b int) int{ if a > b { return a } return b }
复杂度分析
- 时间复杂度:O(N),其中N表示数组的长度,遍历arr数组需要O(N)的时间。
- 空间复杂度:O(1),不需要额外申请空间。