LeetCode 1871 跳跃游戏 VII

LeetCode 1871 跳跃游戏 VII

🟠 中等偏上

https://leetcode.cn/problems/jump-game-vii/description/

递归

if(index>s.size()) return false
if(s[index]=='1') return false; //只能跳0
if(index==s.size()-1) return true;

//下一层调用,遍历所有可能落地位置。

for(int j = i+minJump;j<s.size()&&j<=i+maxJump;j++){
if(jump(j)) return true;
}
return false; //都没返回成功,返回false

    bool jump(string s,int index,int min_jump,int max_jump){

        if(index>s.size()-1){

            return false;

        }

        if(s[index]=='1') return false;

        if(index==s.size()-1){

            return true;

        }

        for(int i = min_jump;i<=max_jump;i++){

            if(jump(s,index+i,min_jump,max_jump)) return true;

        }

        return false;

    }

动规

bool canReach(string s, int minJump, int maxJump) {

        // return jump(s,0,minJump,maxJump);

        vector<bool> dp(s.size(),false);

        if(s[s.size()-1]=='0'){

            dp[s.size()-1] = true;

        }

        else{

            return  false;

        }

            // for(int j = i+minJump;j<=i+maxJump&&j<s.size();j++){

            //     if(dp[j]==true){

            //         dp[i]  = true;

            //         break;

            //     }

            // }

        }

        return dp[0];

    }

在内层循环中遍历所有可能位置,可以用滑窗优化。 但是边界位置要处理号。

bool canReach(string s, int minJump, int maxJump) {

        // return jump(s,0,minJump,maxJump);

        vector<bool> dp(s.size(),false);

        if(s[s.size()-1]=='0'){

            dp[s.size()-1] = true;

        }

        else{

            return  false;

        }

        int true_count = 0;

        for(int i = s.size()-2;i>=0;i--){

            if(i+minJump<=s.size()-1){

                true_count+=dp[i+minJump]==true?1:0;

            }

            if(i+maxJump+1<=s.size()-1){

                true_count-=dp[i+maxJump+1]==true?1:0;

            }

            dp[i] = true_count>0;

            if(s[i]=='1'){

                dp[i] = false;

            }

            // for(int j = i+minJump;j<=i+maxJump&&j<s.size();j++){

            //     if(dp[j]==true){

            //         dp[i]  = true;

            //         break;

            //     }

            // }

        }

        return dp[0];

    }