跳跃游戏
原题链接
我是怀着很愉快沉重 的心情发布这篇博客的。
因为这题是我晚上2点左右,躺在床上睡不着,为了助眠用手机写的。
可是写完还是发现睡不着。
回到这题本身,这题是一个很标准的线性dp和一点点贪心思想。
要求的是能否到达终点。
如果将dp(i)定义为【0…i】能否到达第i个
那么将会有一些问题,比如再来一个元素了,能否达到这个元素呢?
这个序列最远能到达哪里呢?
这个时候需要稍微换一下思路。
能否到达终点,应该换成这个序列最远可到达的下标大于等于n-1。
如果不能的话,那么就是false
如果能 就是true
这样倒推一下,显然可以将dp(i)定义为【0…i】可到达的最远下标
于是我就写出来了这么个代码
可到达的最远下标是当前下标i加上它可以跳跃的最远距离nums[i] ,取前n个最大的即可。
dp[i] 按照如下方式必然存储的是可到达的最远下标,因为所有的元素能到达的下标都考虑一遍。
是自底向上的,从1到n。
class Solution {
public:
bool canJump(vector<int>& nums) {
//寻找能跳到的最远处 判断是否为尾部
int i = 0;
int n = nums.size();
vector<int> dp(n+1);
dp[0] = nums[0];
for(int i = 1; i < n; ++i){
if(dp[i-1] < i) return false;
dp[i] = max(nums[i]+i,dp[i-1]);
}
return true;
}
};
后来又发现还能优化一下内存,没必要存储一个数组。
于是就改了一下
代码如下
class Solution {
public:
bool canJump(vector<int>& nums) {
//寻找能跳到的最远处 判断是否为尾部
int n = nums.size();
int dp = nums[0];
for(int i = 1; i < n; ++i){
if(dp < i) return false;
dp = max(nums[i]+i,dp);
}
return true;
}
};
愿我以后晚上能睡得着!