要求:数组每格代表能跳远距离,求跳到结尾要多少次
思路:
法一:dp,要空间不太行
class Solution {
public:
int jump(vector<int>& nums) {
int n=nums.size();
vector<int> v(n);//v[i]表示到达i最少需要多少次
for(int i=0;i<n;++i){
for(int j=1;j<=nums[i]&&i+j<n;++j){
v[i+j]=(v[i+j]==0?v[i]+1:min(v[i]+1,v[i+j]));
}
}
return v[n-1];
}
};
法二:贪心(就是不用空间)只用记下上一次能跳的范围
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1)return 0;
int n=nums.size();
int start=0,end=0;
int step=0;
int maxpos=0;
while(true){
++step;
for (int i=start;i<=end;++i)
maxpos=max(maxpos,nums[i]+i);
if(maxpos>=n-1)return step;
start=end+1;
end=maxpos;
}
return -1;
}
};