Leetcode之跳跃游戏VII

题目:

给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。一开始,你在下标 0 处,且该位置的值一定为 '0' 。当同时满足如下条件时,你可以从下标 i 移动到下标 j 处:

i + minJump <= j <= min(i + maxJump, s.length - 1) 且
s[j] == '0'.
如果你可以到达 s 的下标 s.length - 1 处,请你返回 true ,否则返回 false 。

示例 1:

输入:s = "011010", minJump = 2, maxJump = 3
输出:true
解释:
第一步,从下标 0 移动到下标 3 。
第二步,从下标 3 移动到下标 5 。
示例 2:

输入:s = "01101110", minJump = 2, maxJump = 3
输出:false

提示:

2 <= s.length <= 105
s[i] 要么是 '0' ,要么是 '1'
s[0] == '0'
1 <= minJump <= maxJump < s.length

 

代码:

class Solution {
public:
    bool canReach(string s, int minJump, int maxJump) {
        int len=s.size();
    int start=0,end=0;
    vector<bool> visit(len,false);
    visit[0]=true;
    while (start<len){
        int tempstart=INT_MAX,tempend=INT_MIN;
        for(int i=start;i<=min(len-1,end);i++){
            if(s[i]!='0')continue;
            tempstart=min(tempstart,i+minJump);
            tempend=max(tempend,i+maxJump);
            visit[i]= true;
        }
        start=tempstart>end?tempstart:end+1;
        end=tempend;
    }
    return visit[len-1];
    }
};

思路:

在有上界和下界的跳跃游戏中,可以每次更新可以访问到的范围start和end;这样可以减小复杂度;另外,不要访问重复的区域,可以通过start=tempstart>end?tempstart:end+1来判断;这样可以减小时间复杂度;使用visit数组表示,一个位置是否被遍历过,最后返回visit[len-1];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值