标签:前缀 int VII 区间 maxJump 权值 跳跃 5765 minJump
思路
每次可以选择给定区间的步数进行跳跃,并且要求达到的点权值为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能不到达到
}
};
标签:前缀,int,VII,区间,maxJump,权值,跳跃,5765,minJump 来源: https://blog.csdn.net/qq_43563669/article/details/117194491
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。