【leetcode】Jump Game II

来源:互联网 发布:网络摄像机怎么看回放 编辑:程序博客网 时间:2024/04/29 18:26

【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
原创粉丝点击