力扣 题目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 };
代码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 };