後ろから前への貪欲は単調ではないので、時間計算量はO(n ^ 2)です。
class Solution {
public:
int jump(vector<int>& nums) {
/* 假设存在一段路径0->P1->P2->P3->n-1是最优路径
我们选取一个中间路径L,使得L<=P3,但L能跳到n-1
即贪心策略是每次从终点选择最靠左的路径。
这样的时间复杂度是O(n^2)
*/
int n = nums.size(), last = nums.size()-1;
int res = 0;
while(last!=0){
int tmp = last;
for(int j=last-1;j>=0;j--){
if(nums[j]+j>=last){
tmp = j;
}
}
last = tmp;
res++;
}
return res;
}
};
貪欲な前から後ろへ、f [i]は位置iにジャンプするための最小ステップ数を表すと仮定し、i <jの場合、f [j]> f [i]が存在する必要があります。これは、より明白であることがわかります。 jにジャンプできます。iにジャンプできる必要があります。したがって、セクションごとに繰り返すことができます。
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
vector<int> f(n);
for(int i=1,j=0;i<n;i++){
while(nums[j]+j<i) j++;
f[i] = f[j]+1;
}
return f[n-1];
}
};