ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

力扣 题目55--跳跃游戏

2022-05-18 13:02:43  阅读:178  来源: 互联网

标签:nums 55 力扣 -- 100000 far position loop size


题目


题解

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

 

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

比如我们

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

 

标签:nums,55,力扣,--,100000,far,position,loop,size
来源: https://www.cnblogs.com/zx469321142/p/16284269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有