Skip to content

Commit 14dc558

Browse files
Create Jump_Game
1 parent f810027 commit 14dc558

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

algorithms/Jump_Game

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
class Solution {
2+
public:
3+
// 分析题意
4+
// 首先读懂题意,每个位置都可以跳跃,题目没有说明只能向右跳,所以向左跳和向右跳都是可以的。但向左跳会增加我们搜索的复杂度
5+
// 思考向左跳有意义吗?向左跳没有意义,可以剪枝
6+
// 反证法,加入向左跳一次才能到达终点。那么在当前状态A向左跳一次到B,也是相当于在到达当前状态之前的所有状态直接跳到B
7+
// 主要是因为起点是0,既然能调到更远的位置A,那么也能调到更近的位置B
8+
9+
// method 1, 因而可以用递归方法,每次向右跳, 但会超出时间限制错误
10+
// bool canRightJump(vector<int>& nums, int now){
11+
// // 处理特殊case, 已经到达终点,返回真
12+
// if (nums.size() - now == 1)return true;
13+
// // 至少跳一步
14+
// for (int i = 1; i <= nums[now]; ++i){
15+
// // 不能超出界限
16+
// if (now + i >= nums.size())continue;
17+
// // 处理一般情况
18+
// if (canRightJump(nums, now + i))return true;
19+
// }
20+
// return false;
21+
// }
22+
23+
// bool canJump(vector<int>& nums) {
24+
// // 处理异常case
25+
// assert(nums.size() >= 1);
26+
// // 调用递归函数,初始位置为0
27+
// if (canRightJump(nums, 0))return true;
28+
// else return false;
29+
// }
30+
// method 2, 利用推理将问题做一个简化,等价转化为另一个小问题,问题可以转化为是否能跳过所有的值为0的元素
31+
// 根据题意,所有元素都是非负整数,两种可能,正整数和0。
32+
// 如果所有元素都是正整数,那么显然可以跳到终点
33+
// 如果出现为0的元素,那么只要能跳过这个0就可以,采用for循环来遍历所有位置,采用while循环了来判断是否能跳过0
34+
bool canJump(vector<int>& nums){
35+
// 处理异常
36+
assert(nums.size() >= 1);
37+
// NOTE 1, 39和41行代码的顺序不能调换
38+
// 起点即终点,返回真
39+
if (nums.size() == 1)return true;
40+
// 处理特殊情况,第一个位置为0,则永远跳不到终点
41+
if (nums[0] == 0)return false;
42+
// 注意,终点不用判断是否能跳过去,只判断是否能跳过终点前一站就好了
43+
for (int i = 1; i < nums.size() - 1; ++i){
44+
// 非0则继续查找0元素
45+
if (nums[i] != 0)continue;
46+
// 如果是0元素,则往回找看那个位置开始起跳,可以跳过这个0
47+
int j = i - 1;
48+
while (j >= 0){
49+
// <则表示能跳过
50+
if (i - j < nums[j])break;
51+
j--;
52+
}
53+
if (i != 0 && j == -1)return false;
54+
}
55+
// 如果遍历结束表示跳到了终点,返回真
56+
return true;
57+
}
58+
};

0 commit comments

Comments
 (0)