【leetcode】Jump Game II

【leetcode】Jump Game II

    恩……没看tips之前,我看了题目就觉得是DP,和《算法导论》上的切钢条几乎没什么两样。

    状态转移方程

         |->   0   (i=the last position)

m[i]= |->   1   (i+jump distance >= the last position)

         |->   min(m[i+1],m[i+2],...,m[i+jump distance])


class Solution {
    public:

	    int jump(vector<int>& nums) {
		int vSize=nums.size();
		if(vSize<=1)
		    return 1;
		
		int *res;
		res=new int[vSize];
		memset(res,0,vSize*sizeof(int));
		res[vSize-1]=0;
		res[vSize-2]=1;
		for(int i=vSize-3;i>=0;--i)
		{
		    if(nums[i]+i>=vSize-1)
			res[i]=1;
		    else
		    {
			int min=0x7fffffff;
			for(int j=1;j<=nums[j];++j)
			    if(min>res[i+j])
				min=res[i+j];
			res[i]=min+1;
		    }
		}
		return res[0];

		    }

};

    Time Limit Exceeded...倒霉。想想用DP做的,还带备忘录的,不用递归,怎么就超时了呢……某些DP可用GREEDY来做。我想了想(没有严谨推导……),如何贪心才对呢?哦~在当前位置可跳的范围内,找到下一次可跳最远位置,这就是正确的贪心选择。

class Solution {
    public:

	    int jump(vector<int>& nums) {
		int vSize=nums.size();
		if(vSize<=1)
		    return 0;
		
		int res=0,now_pos=0,far_pos=0;
		
		while(now_pos+nums[now_pos]<vSize-1)
		{
		    int tmp=0;
		    for(int i=1;i<=nums[now_pos];++i)
			if(far_pos<nums[i+now_pos]+i+now_pos)
			{
			    tmp=i+now_pos;
			    far_pos=nums[i+now_pos]+i+now_pos;
			}
		    res+=1;
		    now_pos=tmp;
			//cout<<now_pos<<' ';
		    far_pos=0;
		}   
		++res;
		return res;

		    }

};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值