思路
每次可以选择给定区间的步数进行跳跃,并且要求达到的点权值为0.
考虑一个点能达到,那么要求这个点满足两个要求
1.当前权值为0
2.[i-ma,i-mi]这个区间存在可以跳到的点
第一个条件直接判断即可,第二个条件呢?
我们可以用前缀和保存能到达的点的数量,那么就可以O(1)算出区间中是否有可达到的点就行了
赛中有想到这个做法,不知道怎么脑抽了想着倒序去搞(显然正序才行),然后就hack想法了,果然大早上不如晚上有精神
计算上一个区间的时候要注意边界
class Solution {
public:
bool canReach(string s, int minJump, int maxJump) {
int n=s.size();
vector<int>sum(n+1,0);//前缀和保存可到达的点的数量
sum[1]=1;
for(int i=1;i<n;i++){
int flag=0;
//计算上一个区间,注意边界处理
if(s[i]=='0'){
int l=max(i-maxJump,0),r=i-minJump;
if(r>=0 && l<=r && sum[r+1]-sum[l]) flag=1;
}
sum[i+1]=sum[i]+flag;
}
return sum[n]-sum[n-1]; //看点n能不到达到
}
};