博客
关于我
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/

你可能感兴趣的文章
Network Sniffer and Connection Analyzer
查看>>
Network 灰鸽宝典【目录】
查看>>
Networkx写入Shape文件
查看>>
NetworkX系列教程(11)-graph和其他数据格式转换
查看>>
Networkx读取军械调查-ITN综合传输网络?/读取GML文件
查看>>
network小学习
查看>>
Netwox网络工具使用详解
查看>>
Net与Flex入门
查看>>
net包之IPConn
查看>>
net发布的dll方法和类显示注释信息(字段说明信息)[图解]
查看>>
Net操作Excel(终极方法NPOI)
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载
查看>>
NeurIPS(神经信息处理系统大会)-ChatGPT4o作答
查看>>
neuroph轻量级神经网络框架
查看>>
Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
查看>>
NEW DATE()之参数传递
查看>>
New Relic——手机应用app开发达人的福利立即就到啦!
查看>>
new 一个button 然后dispose,最后这个button是null吗???
查看>>
Next.js React Server Components 教程
查看>>