LeetCode周赛第三题——5765. 跳跃游戏 VII(dp+前缀和)

Posted 小鹏说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode周赛第三题——5765. 跳跃游戏 VII(dp+前缀和)相关的知识,希望对你有一定的参考价值。

题目描述

给你一个下标从 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

 

解题思路

这题一开始没有想到前缀和,所以就超时了。后面看了y总的分析,就想明白了。我们可以用dp的思路,用f[i] 来表示当前位置是否可以到达(0不可以,1可以),这样一来我们分析倒数第二步的区间应该是落在[i - maxJump, i - minJump],很明显此时我们只需要确定从开始位置是否能到达区间[i - maxJump, i - minJump]的某一个位置即可。

如果我们想要知道[i, j]区间有多少个位置能到达,我们可以用一个prefix数组来记录前缀和,那么就可以得出其实是有f[j] - f[i - 1]个位置可以跳到,只要 f[j] - f[i - 1] > 0 ,就表示可以跳到第i个位置,此时将 f[i] 设置为1

注意:

  •   更新前缀和是用 f 数组
  •   且要满足 i - minJump >= 1,即保证区间一定存在

 

AC代码

 1 class Solution {
 2     public boolean canReach(String s, int minJump, int maxJump) {
 3         char[] c = s.toCharArray();
 4         int n = c.length;
 5         int[] prefix = new int[n + 1];
 6         // f[i] = 0 表示不能到达当前位置,f[i] = 1表示可以到达当前位置
 7         int[] f = new int[n + 1];  
 8         f[1] = 1;
 9         // 表示前i个位置有几个位置是可以跳到的
10         prefix[1] = 1;
11         for (int i = 2; i <= n; i ++) {
12             // 这里需要判断一下右端点是否存在,即区间是否存在
13             if (c[i - 1] == \'0\' && i - minJump >= 1) { 
14                 int left = Math.max(1, i - maxJump);
15                 int right = i - minJump;
16                 if (prefix[right] > prefix[left - 1]) {
17                     f[i] = 1;
18                 }
19             }
20             prefix[i] = prefix[i - 1] + f[i];
21         }     
22         return f[n] > 0;
23     }
24 }

leetcode链接

以上是关于LeetCode周赛第三题——5765. 跳跃游戏 VII(dp+前缀和)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode5765. 跳跃游戏 VII(前缀和+DP)

第五届在线编程大赛月赛第三题:石子游戏

第五届在线编程大赛月赛第三题:石子游戏

第一次leetcode周赛总结

LeetCode周赛第193场周赛

2019/10/13 leetcode周赛