https://leetcode.com/problems/jump-game/
做完Jump Game ii 才做的这个,所以直接就考虑O(n)做法
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
bool canJump(vector<int>& nums) {
int lastdis=0, curdis=0;
for(int i=0;i<nums.size();i++) {
if(i>lastdis) {
lastdis = curdis;
}
if(i+nums[i] >= curdis && lastdis+nums[lastdis]>=i) {
//lastdis+nums[lastdis]>=i 说明能到达i的位置,这样把curdis更新成i+nums[i]才是有意义的,
//也就是一定能到达curdis的位置,所以if(curdis >= (nums.size()-1) )return true;
curdis = i+nums[i];
if(curdis >= (nums.size()-1) )return true;
}
}
return lastdis >= (nums.size()-1);
}
};
int main() {
freopen("55.txt", "r", stdin);
int n, in;
while(cin >> n) {
vector <int> ivec;
for(int i=0;i<n;i++) {
cin >> in;
ivec.push_back(in);
}
Solution s;
cout << s.canJump(ivec) << endl;
}
return 0;
}
另一个很好的做法:来自这里
http://blog.youkuaiyun.com/loverooney/article/details/38455475
对于题目一,思路很简单,贪心,只需要时刻计算前位置和当前位置所能跳的最远长度,并始终和n作比较就可以:
1,若在任意pos位置出现maxstep为0的情况,则说明无法继续向前移动,返回false
2.若在任意pos位置出现maxstep+pos>=n说明可以完成最后一跳,返回true
代码如下: