跳跃游戏-leetcode

跳跃游戏

原题链接
我是怀着很愉快沉重 的心情发布这篇博客的。
因为这题是我晚上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;
    }
};

愿我以后晚上能睡得着!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值