Given an array arr
that is a permutation of [0, 1, ..., arr.length - 1]
, we split the array into some number of "chunks" (partitions), and individually sort each chunk. After concatenating them, the result equals the sorted array.
What is the most number of chunks we could have made?
Example 1:
Input: arr = [4,3,2,1,0] Output: 1 Explanation: Splitting into two or more chunks will not return the required result. For example, splitting into [4, 3], [2, 1, 0] will result in [3, 4, 0, 1, 2], which isn't sorted.
Example 2:
Input: arr = [1,0,2,3,4] Output: 4 Explanation: We can split into two chunks, such as [1, 0], [2, 3, 4]. However, splitting into [1, 0], [2], [3], [4] is the highest number of chunks possible.
Note:
arr
will have length in range[1, 10]
.arr[i]
will be a permutation of[0, 1, ..., arr.length - 1]
.
分析
这道题意思是将一个数组最多分成多少份,才会使得各个子数组排序后拼接成的最终数组是排好序的。
如果子数组排好序并且拼接后要求总的数组也是排好序的,那么就要求子数组数组arr[start, end]的值都在[start, end]之间,即
start<=arr[i]<=end, if start <= i <= end
那么下面我们就找最小[start, end]的范围能够保证这个关系。记录一个maxIndex = 0,遍历arr,当arr[i] > maxIndex,表明此时需要更新当前子数组的end范围到maxIndex,一直遍历到index == maxIndex,表明此时子数组的所有的arr[i] 都是小于maxIndex的。那么这个时候就找到了一个子数组的边界,res ++。
Code
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int maxIndex = 0;
int res = 0;
int len = arr.size();
for (int i = 0; i < len; i ++)
{
if (arr[i] > maxIndex)
maxIndex = arr[i];
if (i == maxIndex)
res ++;
}
return res;
}
};
运行效率
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Max Chunks To Make Sorted.
Memory Usage: 8.4 MB, less than 57.60% of C++ online submissions for Max Chunks To Make Sorted.