C++实现LeetCode(769.可排序的最大块数)
[LeetCode] 769.Max Chunks To Make Sorted 可排序的最大块数
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]Example 2:
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.
Input: arr = [1,0,2,3,4]Note:
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.
- arr will have length in range [1, 10].
- arr[i] will be a permutation of [0, 1, ..., arr.length - 1].
我们遍历原数组,用cur表示能到达的最远点,然后我们遍历当前位置到cur之间的所有点,遍历的同时如果遇到更大的数字就更新cur,当cur大于等于末尾数字的时候,此时不能再拆分新块儿了,返回结果res加1。否则的话说明到达了最远点,更新第一个for循环的变量i,并且结果res自增1。来看个例子:
[2 0 1 4 3]
当 i=0 时,cur=2,j=1,然后我们发现 j=1 和 j=2 的数字都不会更新cur,且cur也没有大于等于3,所以此时 j=3 的时候退出了内部的for循环,i赋值为2,结果res为1。然后此时 i=3,cur=4,4已经大于末尾的3了,直接返回res加1,即2,参见代码如下:
解法一:
class Solution {public:int maxChunksToSorted(vector& arr) {int res = 0, n = arr.size(); for (int i = 0; i < n; ++i) {int cur = arr[i], j = i + 1; for (; j <= cur; ++j) {cur = max(cur, arr[j]); if (cur >= arr.back()) return res + 1; }i = j - 1; ++res; }return res; }};
其实这道题有更霸道的解法,我们仔细观察一些例子,可以发现断开为新块儿的地方都是当之前出现的最大值正好和当前位置坐标相等的地方,比如例子2中,当 i=1 时,之前最大的数字是1,所以可以断开。而在例子1中,当 i=4 时,才和之前出现过的最大数字4相等,此时断开也没啥意义了,因为后面已经没有数字了,所以还只是一个块儿,参见代码如下:
解法二:
class Solution {public:int maxChunksToSorted(vector& arr) {int res = 0, n = arr.size(), mx = 0; for (int i = 0; i < n; ++i) {mx = max(mx, arr[i]); if (mx == i) ++res; }return res; }};
【C++实现LeetCode(769.可排序的最大块数)】到此这篇关于C++实现LeetCode(769.可排序的最大块数)的文章就介绍到这了,更多相关C++实现可排序的最大块数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- java中如何实现重建二叉树
- leetcode|leetcode 92. 反转链表 II
- 人脸识别|【人脸识别系列】| 实现自动化妆