【每日一题】1654. 到家的最少跳跃次数

【每日一题】1654. 到家的最少跳跃次数

1654. 到家的最少跳跃次数

题目描述

有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发,到达它的家。

跳蚤跳跃的规则如下:

它可以 往前 跳恰好 a 个位置(即往右跳)。
它可以 往后 跳恰好 b 个位置(即往左跳)。
它不能 连续 往后跳 2 次。
它不能跳到任何 forbidden 数组中的位置。
跳蚤可以往前跳 超过 它的家的位置,但是它 不能跳到负整数 的位置。

给你一个整数数组 forbidden ,其中 forbidden[i] 是跳蚤不能跳到的位置,同时给你整数 a, b 和 x ,请你返回跳蚤到家的最少跳跃次数。如果没有恰好到达 x 的可行方案,请你返回 -1 。

示例 1:

输入:forbidden = [14,4,18,1,15], a = 3, b = 15, x = 9
输出:3
解释:往前跳 3 次(0 -> 3 -> 6 -> 9),跳蚤就到家了。

示例 2:

输入:forbidden = [8,3,16,6,12,20], a = 15, b = 13, x = 11
输出:-1

示例 3:

输入:forbidden = [1,6,2,14,5,17,4], a = 16, b = 9, x = 7
输出:2
解释:往前跳一次(0 -> 16),然后往回跳一次(16 -> 7),跳蚤就到家了。

提示:

1 <= forbidden.length <= 1000
1 <= a, b, forbidden[i] <= 2000
0 <= x <= 2000
forbidden 中所有位置互不相同。
位置 x 不在 forbidden 中。

解题思路

思路:该题给定的情景是数轴,我最开始的想法是直观模拟,使用一个哈希表uset存储禁区,使用pos表示当前位置,使用back表示是否后退一次,使用great表示是否超过目标位置,使用res表示跳跃次数。每次使用预判+执行模式,即如果当前位置pos等于目标位置x则返回跳跃次数res,反之如果向前走一步后pos+a不在禁区则向前走一步,否则尝试向后走,如果向后走一步pos-b大于等于0并且不在禁区则向后走一步。这种思路解答错误并且只能过59/96的案例,其实我调试后发现最大的原因即是,向前走走到哪里停止并断定无解呢?因为跳蚤是可以跳过超过他的家的位置的,但是有的情况是跳了后回退是可以到达目标位置的,但是有的跳了后回退是不可以到达目标位置的,如何界定呢?第一次的代码我是允许跳蚤超过一次家的位置,这是不完整的,但是能够一半案例。于是我猜测是和a、b以及x的大小有关系,还有一种思路是如果可以到达家,必定满足a*i-b*j=x。

// 解答错误
class Solution {
public:
    int minimumJumps(vector<int>& forbidden, int a, int b, int x) {
        // 使用哈希表存储 便于查找
        unordered_set<int> uset(forbidden.begin(),forbidden.end());
        int pos=0;
        bool back=false;
        int res=0;
        bool great=false;
        while(true)
        {
            // 到达目的地
            if(pos==x)
                return res;
            // 可以往前走 怎么控制不要太跳过?
            if(uset.count(pos+a)==0&&!great)
            {
                pos+=a;
                res+=1;
                back=false;
                // 可以一次超过 否则后退
                if(pos>x)
                    great=true;
            }
            // 尝试往后走
            else
            {
                // 可以往后走
                if(!back)
                {
                    if(pos-b>=0&&uset.count(pos-b)==0)
                    {
                        pos-=b;
                        res+=1;
                        back=true;
                        // 复原
                        if(pos<x)
                            great=false;
                    }
                    else
                        return -1;
                }
                else
                    return -1;
            }
            // cout<<pos<<endl;
        }
        return res;
    }
};

优化:于是我看了题解。此题算是求最短路径问题,最短路径一般使用BFS或者Dijkstra算法。该题虽然是数轴,但可以认为是边权重均相同的图,故选择BFS算法。使用队列记三元组状态(位置,方向,步数),使用集合记录禁区,使用集合记录已经访问过的状态(包含位置和方向),即同一位置前进和后退对应的状态不同。该图是无限图,需要确定上限和下限才好操作,其中下限是0,上限分三种情况讨论。一是a=b,则上限的x;二是a>b,则上限是x+b,可以理解为最多回退b到达目标;三是a<b,则上限是f+a+b,可以理解为最多回退b到达禁区,但是不能到达禁区,故剩余范围是a。初始状态为原点前进步数0即(0,1,0),当队列不为空时,取出队列头部,此时可以选择前进,如果其方向为前进则也可以选择后退,其中前进后退的判断逻辑类似,可以借助图画出整个BFS过程。

class Solution {
public:
    // [162,118,178,152,167,100,40,74,199,186,26,73,200,127,30,124,193,84,184,36,103,149,153,9,54,154,133,95,45,198,79,157,64,122,59,71,48,177,82,35,14,176,16,108,111,6,168,31,134,164,136,72,98]
        //  0 1 0
        // 1111111
        // 29 1 1
        // 1111111
        // 58 1 2
        // 1111111
        // 87 1 3
        // 1111111
        // 116 1 4
        // 1111111
        // 2222222
        // 145 1 5
        // 1111111
        // 2222222
        // 18 -1 5
        // 1111111
        // 174 1 6
        // 1111111
        // 2222222
        // 47 -1 6
        // 1111111
        // 47 1 6
        // 203 1 7
        // 1111111
        // 2222222
        // 76 -1 7
        // 1111111
        // 76 1 7
        // 232 1 8
        // 1111111
        // 105 -1 8
        // 105 1 8
        // 2222222
        // 261 1 9
        // 1111111
        // 2222222
        // 7 -1 9
        // 290 1 10
        // 1111111
        // 2222222
        // 163 -1 10
        // 1111111
        // 319 1 11
        // 2222222
        // 192 -1 11
        // 1111111
        // 192 1 11
        // 2222222
        // 221 -1 12
        // 1111111
        // 221 1 12
        // 2222222
        // 94 -1 12
        // 1111111
        // 250 1 13
        // 1111111
        // 123 -1 13
        // 123 1 13
        // 2222222
        // 279 1 14
        // 1111111
        // 2222222
        // 25 -1 14
        // 308 1 15
        // 2222222
        // 181 -1 15
        // 1111111
        // 210 -1 16
        // 1111111
        // 210 1 16
        // 2222222
        // 239 1 17
        // 1111111
        // 2222222
        // 112 -1 17
        // 1111111
        // 268 1 18
        // 1111111
        // 2222222
        // 141 -1 18
        // 1111111
        // 141 1 18
        // 2222222
        // 297 1 19
        // 1111111
        // 170 -1 19
        // 170 1 19
        // 43 -1 19
        // 326 1 20
        // 2222222
        // 228 -1 21
        // 1111111
        // 257 1 22
        // 1111111
        // 2222222
        // 286 1 23
        // 1111111
        // 2222222
        // 159 -1 23
        // 1111111
        // 315 1 24
        // 2222222
        // 188 -1 24
        // 1111111
        // 188 1 24
        // 2222222
        // 217 -1 25
        // 1111111
        // 217 1 25
        // 2222222
        // 90 -1 25
        // 1111111
        // 246 1 26
        // 1111111
        // 2222222
        // 119 -1 26
        // 1111111
        // 119 1 26
        // 2222222
        // 275 1 27
        // 1111111
        // 148 -1 27
        // 148 1 27
        // 2222222
        // 21 -1 27
        // 1111111
        // 304 1 28
        // 2222222
        // 50 -1 28
        // 50 1 28
        // 206 -1 29
        // 1111111
        // 235 1 30
        // 1111111
        // 2222222
        // 264 1 31
        // 1111111
        // 2222222
        // 137 -1 31
        // 1111111
        // 293 1 32
        // 1111111
        // 2222222
        // 166 -1 32
        // 1111111
        // 166 1 32
        // 2222222
        // 322 1 33
        // 2222222
        // 195 -1 33
        // 1111111
        // 195 1 33
        // 2222222
        // 68 -1 33
        // 1111111
        // 224 -1 34
        // 1111111
        // 224 1 34
        // 2222222
        // 97 -1 34
        // 1111111
        // 97 1 34
        // 253 1 35
        // 1111111
        // 2222222
        // 126 -1 35
        // 1111111
        // 126 1 35
        // 2222222
        // 282 1 36
        // 1111111
        // 155 -1 36
        // 155 1 36
        // 2222222
        // 28 -1 36
        // 1111111
        // 311 1 37
        // 2222222
        // 57 -1 37
        // 1111111
        // 57 1 37
        // 213 -1 38
        // 1111111
        // 86 1 38
        // 1111111
        // 242 1 39
        // 1111111
        // 2222222
        // 115 1 39
        // 1111111
        // 2222222
        // 271 1 40
        // 1111111
        // 2222222
        // 144 -1 40
        // 1111111
        // 144 1 40
        // 2222222
        // 17 -1 40
        // 1111111
        // 300 1 41
        // 2222222
        // 173 -1 41
        // 1111111
        // 173 1 41
        // 2222222
        // 46 -1 41
        // 1111111
        // 46 1 41
        // 202 -1 42
        // 1111111
        // 202 1 42
        // 2222222
        // 75 -1 42
        // 1111111
        // 75 1 42
        // 231 1 43
        // 1111111
        // 104 -1 43
        // 104 1 43
        // 260 1 44
        // 1111111
        // 289 1 45
        // 1111111
        // 2222222
        // 318 1 46
        // 2222222
        // 191 -1 46
        // 1111111
        // 220 -1 47
        // 1111111
        // 220 1 47
        // 249 1 48
        // 1111111
        // 2222222
        // 278 1 49
        // 1111111
        // 2222222
        // 151 -1 49
        // 1111111
        // 307 1 50
        // 2222222
        // 180 -1 50
        // 1111111
        // 180 1 50
        // 209 -1 51
        // 1111111
        // 209 1 51
        // 238 1 52
        // 1111111
        // 2222222
        // 267 1 53
        // 1111111
        // 2222222
        // 140 -1 53
        // 1111111
        // 296 1 54
        // 1111111
        // 169 -1 54
        // 169 1 54
        // 325 1 55
        // 2222222
        // 227 -1 56
        // 1111111
        // 256 1 57
        // 1111111
        // 2222222
        // 285 1 58
        // 1111111
        // 2222222
        // 158 -1 58
        // 1111111
        // 314 1 59
        // 2222222
        // 187 -1 59
        // 1111111
        // 187 1 59
        // 2222222
        // 216 -1 60
        // 1111111
        // 216 1 60
        // 89 -1 60
        // 245 1 61
        // 1111111
        // 2222222
        // 274 1 62
        // 1111111
        // 147 -1 62
        // 303 1 63
        // 2222222
        // 205 -1 64
        // 1111111
        // 234 1 65
        // 1111111
        // 263 1 66
        // 1111111
        // 2222222
        // 292 1 67
        // 1111111
        // 2222222
        // 165 -1 67
        // 1111111
        // 321 1 68
        // 2222222
        // 194 -1 68
        // 1111111
        // 194 1 68
        // 2222222
        // 223 -1 69
        // 1111111
        // 223 1 69
        // 2222222
        // 96 -1 69
        // 1111111
        // 252 1 70
        // 1111111
        // 125 -1 70
        // 125 1 70
        // 2222222
        // 281 1 71
        // 1111111
        // 2222222
        // 27 -1 71
        // 1111111
        // 310 1 72
        // 2222222
        // 183 -1 72
        // 1111111
        // 56 1 72
        // 1111111
        // 212 -1 73
        // 1111111
        // 212 1 73
        // 2222222
        // 85 1 73
        // 1111111
        // 241 1 74
        // 1111111
        // 2222222
        // 114 -1 74
        // 1111111
        // 114 1 74
        // 270 1 75
        // 1111111
        // 2222222
        // 143 -1 75
        // 1111111
        // 143 1 75
        // 299 1 76
        // 2222222
        // 172 -1 76
        // 1111111
        // 172 1 76
        // 201 -1 77
        // 1111111
        // 201 1 77
        // 230 1 78
        // 1111111
        // 2222222
        // 259 1 79
        // 1111111
        // 2222222
        // 132 -1 79
        // 1111111
        // 288 1 80
        // 1111111
        // 2222222
        // 161 -1 80
        // 1111111
        // 161 1 80
        // 2222222
        // 317 1 81
        // 2222222
        // 190 -1 81
        // 1111111
        // 190 1 81
        // 2222222
        // 63 -1 81
        // 1111111
        // 219 -1 82
        // 1111111
        // 219 1 82
        // 2222222
        // 92 -1 82
        // 1111111
        // 92 1 82
        // 248 1 83
        // 1111111
        // 2222222
        // 121 -1 83
        // 1111111
        // 121 1 83
        // 2222222
        // 277 1 84
        // 1111111
        // 2222222
        // 150 -1 84
        // 1111111
        // 150 1 84
        // 2222222
        // 23 -1 84
        // 1111111
        // 306 1 85
        // 2222222
        // 179 -1 85
        // 1111111
        // 179 1 85
        // 2222222
        // 52 -1 85
        // 1111111
        // 52 1 85
        // 208 -1 86
        // 1111111
        // 208 1 86
        // 2222222
        // 81 -1 86
        // 1111111
        // 81 1 86
        // 237 1 87
        // 1111111
        // 2222222
        // 110 -1 87
        // 1111111
        // 110 1 87
        // 2222222
        // 266 1 88
        // 1111111
        // 139 -1 88
        // 139 1 88
        // 2222222
        // 12 -1 88
        // 1111111
        // 295 1 89
        // 1111111
        // 2222222
        // 41 -1 89
        // 1111111
        // 41 1 89
        // 324 1 90
        // 2222222
        // 197 -1 90
        // 1111111
        // 70 1 90
        // 1111111
        // 226 -1 91
        // 1111111
        // 226 1 91
        // 2222222
        // 99 1 91
        // 1111111
        // 2222222
        // 255 1 92
        // 1111111
        // 128 -1 92
        // 128 1 92
        // 1 -1 92
        // 284 1 93
        // 1111111
        // 313 1 94
        // 2222222
        // 215 -1 95
        // 1111111
        // 244 1 96
        // 1111111
        // 2222222
        // 273 1 97
        // 1111111
        // 2222222
        // 146 -1 97
        // 1111111
        // 302 1 98
        // 2222222
        // 175 -1 98
        // 1111111
        // 175 1 98
        // 2222222
        // 204 -1 99
        // 1111111
        // 204 1 99
        // 2222222
        // 77 -1 99
        // 1111111
        // 233 1 100
        // 1111111
        // 2222222
        // 106 -1 100
        // 1111111
        // 106 1 100
        // 2222222
        // 262 1 101
        // 1111111
        // 135 -1 101
        // 135 1 101
        // 2222222
        // 8 -1 101
        // 1111111
        // 291 1 102
        // 1111111
        // 37 -1 102
        // 1111111
        // 37 1 102
        // 320 1 103
        // 2222222
        // 66 1 103
        // 222 -1 104
        // 1111111
        // 251 1 105
        // 1111111
        // 280 1 106
        // 1111111
        // 2222222
        // 309 1 107
        // 2222222
        // 182 -1 107
        // 1111111
        // 211 -1 108
        // 1111111
        // 211 1 108
        // 2222222
        // 240 1 109
        // 1111111
        // 2222222
        // 113 -1 109
        // 1111111
        // 269 1 110
        // 1111111
        // 2222222
        // 142 -1 110
        // 1111111
        // 142 1 110
        // 2222222
        // 298 1 111
        // 1111111
        // 171 -1 111
        // 171 1 111
        // 44 -1 111
        // 327 1 112
        // 2222222
        // 229 -1 113
        // 1111111
        // 258 1 114
        // 1111111
        // 2222222
        // 287 1 115
        // 1111111
        // 2222222
        // 160 -1 115
        // 1111111
        // 316 1 116
        // 2222222
        // 189 -1 116
        // 1111111
        // 189 1 116
        // 2222222
        // 218 -1 117
        // 1111111
        // 218 1 117
        // 2222222
        // 91 -1 117
        // 1111111
        // 247 1 118
        // 1111111
        // 120 -1 118
        // 120 1 118
        // 2222222
        // 276 1 119
        // 1111111
        // 22 -1 119
        // 1111111
        // 305 1 120
        // 2222222
        // 51 1 120
        // 1111111
        // 207 -1 121
        // 1111111
        // 80 1 121
    int minimumJumps(vector<int>& forbidden, int a, int b, int x) {
        // 坐标 方向 步数
        queue<tuple<int,int,int>> q;
        // 存储访问过的点 包含位置和方向
        unordered_set<int> visited;
        // 禁止访问雷区
        unordered_set<int> forbiddenSet(forbidden.begin(),forbidden.end());
        // 界限 max(b+x,f+b+a)
        // a=b x; a>b x+b; a<b f+a+b
        // 初始化
        q.emplace(0,1,0);
        visited.emplace(0);
        // 最短路径 BFS 无限图 确定上下限 有限图
        int lower=0,upper=max(b+x,*max_element(forbidden.begin(),forbidden.end())+b+a);
        // BFS求图边权为1的最短路径
        while(!q.empty())
        {
            auto [position,direction,step] = q.front();
            // cout<<position<<" "<<direction<<" "<<step<<endl;
            q.pop();
            // 到达目标位置
            if(position==x)
                return step;
            // 下一步状态信息
            int nextPosition=position+a;
            int nextDirection=1;
            // visited判断是否走过 要将正走和回退分开算
            if(lower<=nextPosition&&nextPosition<=upper&&!visited.count(nextDirection*nextPosition)&&!forbiddenSet.count(nextPosition))
            {
                // cout<<"1111111"<<endl;
                visited.emplace(nextPosition*nextDirection);
                q.emplace(nextPosition,nextDirection,step+1);
            }
            // 不满足的情况下 不能连续两次回退 前进到达的情况下可以选择后退
            if(direction==1)
            {
                nextPosition=position-b;
                nextDirection=-1;
                if(lower<=nextPosition&&nextPosition<=upper&&!visited.count(nextDirection*nextPosition)&&!forbiddenSet.count(nextPosition))
                {
                    // cout<<"2222222"<<endl;
                    visited.emplace(nextPosition*nextDirection);
                    q.emplace(nextPosition,nextDirection,step+1);
                }
            }
        }
        return -1;
    }
    };

总结:感觉很隐晦,拨开层层迷雾的感觉。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值