如果位置i上的字符是0,并且我们可以到达,那么我们就可以知道[i+minJump, i+maxJump]这段区间我们也可以到达。那么如何做标记呢?将区间内的位置逐一遍历显然是低效的做法,我们马上联想到常用的一个工具:差分数组。
具体的说,如果区间[a,b]能被访问到,我们就给这个区间里的每个元素的visit属性加1. 处理完所有的区间之后,那些visit属性大于0的,一定就是能到达的位置;反之visit是0,意味着无论如何都到达不了。其中,给一个区间[a,b]里面的所有元素整体增1,这就是典型的range addition
,正解是利用差分数组diff,更新diff[a]+=1,diff[b+1]-=1
.
综上,具体的解法如下。我们遍历位置i时,i是否能达到就取决于visit+=diff[i]
,如果visit==0
或者s[i]=='1'
都可以忽略该点。否则的话,我们需要立足位置i,标记以它为起点所转移的区间[i+minJump, i+maxJump]为“可到达”,即标记diff[i+minJump]+=1; diff[i+maxJump+1]-=1;
.
最终答案就是最后一个位置上是否是'0'且它的visit属性是否大于0.