其他分享
首页 > 其他分享> > 5765. 跳跃游戏 VII

5765. 跳跃游戏 VII

作者:互联网

思路

每次可以选择给定区间的步数进行跳跃,并且要求达到的点权值为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