LeetCode45ジャンプゲームII(貪欲と詳細なメモ)

タイトル説明

非負の整数の配列が与えられると、最初は配列の最初の位置にいます。
配列の各要素は、その位置でジャンプできる最大の長さを表します。
目標は、最小数のジャンプを使用して配列の最後の位置に到達することです。

例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

説明:

配列の最後の位置にいつでも到達できると仮定します。

アルゴリズムのアイデアとACコード

各選択の優先順位は、次の位置にジャンプできる最大の添え字に基づいています。トラバーサルを通過するたびに、範囲内の離陸地点に到達し、到達できる次の離陸地点を選択できます。最後の要素を飛び越えるまでの最も遠い距離。使用される回数は、ジャンプゲームに必要な最小回数であり、時間計算量はO(n ^ 2)であり、空間計算量はO(1)です。

class Solution {
    
    
public:
    //贪心法
    int jump(vector<int>& nums) {
    
    
        int num=0;//用来保存跳跃次数
        for(int i = 0;i<nums.size()-1;){
    
    
            int temp1=0,temp2=0;//分别维护后续遍历中起跳点所能到达的最远下标和起跳点的下标
            for(int j = 1;j<=nums[i];j++){
    
    
                if(i+j>=nums.size()-1){
    
    
                    return num+1;
                }//如果达到最后的下标或之后,证明再走一步即能到达
                if(i+j+nums[i+j]>temp1){
    
    
                    temp1 = i+j+nums[i+j];
                    temp2 = j;
                }
            }
            i = i + temp2;//更新起跳点
            num++;//更新跳跃次数
        }
        return num;
    }
};

結果の
ここに画像の説明を挿入
送信実行時間は8ms、メモリ消費量は7.9MBです。

おすすめ

転載: blog.csdn.net/weixin_44925547/article/details/106262058