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

你可能感兴趣的文章
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
netsh advfirewall
查看>>
Netty WebSocket客户端
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
Netty工作笔记0006---NIO的Buffer说明
查看>>
Netty工作笔记0011---Channel应用案例2
查看>>
Netty工作笔记0013---Channel应用案例4Copy图片
查看>>
Netty工作笔记0014---Buffer类型化和只读
查看>>
Netty工作笔记0020---Selectionkey在NIO体系
查看>>
Vue踩坑笔记 - 关于vue静态资源引入的问题
查看>>
Netty工作笔记0025---SocketChannel API
查看>>
Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>