博客
关于我
769. 最多能完成排序的块
阅读量:780 次
发布时间:2019-03-25

本文共 699 字,大约阅读时间需要 2 分钟。

维护一个值是最右端,比如43210,那么一开始的r就是4,就是从这里到下标为4的就是一整块,但是中间可能有超过4的,比如453210,那么在中间的过程中就会更新成5,那么一直到5才是一块。这类似于我们在扫描数组时动态维护一个区间的结束点。

具体来说,我们可以这样想:我们需要为每个位置i确定它最终应该属于哪个子块。为了找到这些子块,我们可以使用一个变量r,它表示当前应该属于同一子块的最右端位置。

举个例子,假设i=0时,当前元素的值是4,我们将r设置为4,因为4比之前所有的值都大。i=1时,元素的值是5,比r大,所以r也更新为5。接着,i=2,发现元素是3,比r小,r保持不变。i=3时,元素是2,比r小,依然不更新。i=4时,元素是1,比r小,此时i等于r(4),所以我们需要将这作为一个子块结束,计数器res加1。

当i=5时,元素是0,同样比r=5小,所以不会改变r。i=5的时候,i等于r=5,所以又形成了一个子块,res加1。最终,整个数组可以被分成了3个子块。

这个思路的关键在于:每当i等于当前的r值时,我们就找到了一个完整的子块,这样我们就可以停下来数一下块的数量。这种方法省去了传统区间划分的麻烦,同时代码也变得非常简洁。

整块代码如下:

class Solution {public:int maxChunksToSorted(vector

&arr) {int res = 0;int r = 0;for(int i = 0; i < arr.size(); ++i) {r = max(arr[i], r);if(i == r) res++;}return res;}}

转载地址:http://zajuk.baihongyu.com/

你可能感兴趣的文章
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
mutiplemap 总结
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>