基本思路:
总的来说两种思路,但是个人觉得DP更好一些;
DP思路:
直接建立一维DP思路,DP每个位置代表跳到该位置的最短距离;
时间复杂度为O(n^2)
贪心思路:
这个自己没想到,总是感觉贪心会爆时间;
个人感觉题解是脱了裤子放屁,既然找最远的,直接每次以最远距离为新的起点即可;
但是后来看了55题,发现确实很有道理;
curdistence代表了从当前节点起,能够到达的最大距离,而maxdistence代表当前节点~curdistence中,能够在下一步到达的最大距离;
因此,curdistence在下一次选取中,必须是maxdistence的最大值;
而下一次选取条件就是逐位遍历,当i=curdistence,默认已经选择了0~curdistencce的最优点,stripe+1,curdistence=maxdistence;
总体代码:
DP:
class Solution {
public:
int jump(vector<int>& nums) {
vector<int>dp(nums.size());
dp[0]=0;
for(int i=1;i<dp.size();i++){
int min=INT_MAX;
for(int j=0;j<i;j++){
if(nums[j]+j>=i){
if(dp[j]+1<min){
min=dp[j]+1;
}
}
}
dp[i]=min;
}
return dp[dp.size()-1];
}
};
贪心思路:
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1)
return 0;
int position=0;
int stripe=0;
while(1){
int max=0;
int next_p=0;
for(int i=position+1;i<=position+nums[position];i++){
if(i>=nums.size()-1){
return stripe+1;
}
if(max<nums[i]+i){
max=nums[i]+i;
next_p=i;
}
}
position=next_p;
stripe++;
}
return stripe;
}
};
官方贪心思路:
class Solution {
public:
int jump(vector<int>& nums) {
int stripe=0;
int curdistence=0;
int maxdistence=0;
for(int i=0;i<nums.size()-1;i++){
maxdistence=max(maxdistence,nums[i]+i);
if(curdistence==i){
stripe++;
curdistence=maxdistence;
}
}
return stripe;
}
};