【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;
}
};