题目:
给你一个下标从 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];