有一只跳蚤的家在数轴上的位置 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& forbidden, int a, int b, int x) {
// 使用哈希表存储 便于查找
unordered_set 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
优化:于是我看了题解。此题算是求最短路径问题,最短路径一般使用BFS或者Dijkstra算法。该题虽然是数轴,但可以认为是边权重均相同的图,故选择BFS算法。使用队列记三元组状态(位置,方向,步数),使用集合记录禁区,使用集合记录已经访问过的状态(包含位置和方向),即同一位置前进和后退对应的状态不同。该图是无限图,需要确定上限和下限才好操作,其中下限是0,上限分三种情况讨论。一是a=b,则上限的x;二是a>b,则上限是x+b,可以理解为最多回退b到达目标;三是a
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
总结:感觉很隐晦,拨开层层迷雾的感觉。