欲張りアルゴリズムLeetcode45ジャンプゲームの証明プロセス

 

後ろから前への貪欲は単調ではないので、時間計算量は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];
    }
};

 

 

 

 

 

おすすめ

転載: blog.csdn.net/wwxy1995/article/details/113853470