力扣 题目55--跳跃游戏

题目


题解

我们可以记录一下跳之后的最远距离

 

并把能够跳到的位置记录 一下

比如我们

vector<int> loop(nums.size(), 0);

当某个数可以被跳入时 对应位置的loop变为1

以3,2,1,0,4为例

一开始跳3 那么我们将 2,1,0 loop位置改为1

这样遍历到4时loop对应位置是0 即发现没有能够跳到的 即返回false;

一些技巧

1.实际上我们可以发现 如果不能跳 那么就一定是卡在0 后面的都不能跳入 所以我们只要每一轮判断loop对应位置是否为0即可

2.我们可以判断每一轮循环的最远距离是否比当前的最远距离 还远 如果远 就将差的那部分loop改为1 然后更新最远距离

3.如果在2中将差的部分改为1时 遍历到最后了 直接返回true

以上基本是就可以通过了 但是提交之后发现空间复杂度不太理想 那么应该思考如何在原来的数组上动手脚而不是新开一个容器

题目中要求提到 nums[i] <= 10的5次方 那么我们将能跳的数全部+10的5次方 然后更新一下其他条件就可以了

代码

代码1 新开容器

 1 class Solution {
 2 public:
 3     bool canJump(vector<int>& nums) {
 4         int position = 0;
 5         //记录上次到达最远的距离
 6         int far = 0;
 7         //全部最大用来比较
 8         if (nums.size() == 1) {
 9             return 1;
10         }
11         vector<int> loop(nums.size(), 0);
12         loop[0] = 1;
13         for (; position < nums.size() - 1; position++) {
14             if (loop[position] == 0) {
15                 return false;
16             }
17             if (far>= position+ nums[position]) {
18                 continue;
19             }
20             for (int i = 1; i < position+ nums[position]-far+1&& far + i<nums.size(); i++) {
21                 loop[far + i] = 1;
22                 if ((far + i) == nums.size() - 1) {
23                     return true;
24                 }
25             }
26             far = position+ nums[position];
27         }
28         return false;
29     }
30 };
View Code

代码2 10的5次方

 1 class Solution {
 2 public:
 3     bool canJump(vector<int>& nums) {
 4         int position = 0;
 5         //记录上次到达最远的距离
 6         int far = 0;
 7         //如果只有一个 必定为true
 8         if (nums.size() == 1) {
 9             return 1;
10         }
11         //第一个+100000
12         nums[0] += 100000;
13         //循环
14         for (; position < nums.size() - 1; position++) {
15             //如果nums[position]<100000 说明没有跳到 直接返回false
16             if (nums[position]< 100000) {
17                 return false;
18             }
19             //如果far最远大于position + nums[position]-100000 即最大跳的距离 直接结束本来循环即可
20             if (far >= position + nums[position]- 100000) {
21                 continue;
22             }
23             //如果far小于position + nums[position]-100000  则更新
24             for (int i = 1; i < position + nums[position] - far + 1 - 100000 && far + i < nums.size(); i++) {
25                 nums[far + i] += 100000;
26                 //如果遍历到nums.size() - 1说明可以跳到最后 则直接返回true
27                 if ((far + i) == nums.size() - 1) {
28                     return true;
29                 }
30             }
31             //更新
32             far = position + nums[position] - 100000;
33         }
34         return false;
35     }
36 };
View Code

 

posted @ 2022-05-18 12:44  无聊的阿库娅  阅读(30)  评论(0编辑  收藏  举报