leetcode 毎日の質問: 45. ジャンピング ゲーム II

シリーズ: 貪欲アルゴリズム
言語: java
タイトル出典: Leetcode45. Jumping Game II

トピック

長さ n のゼロ インデックス付き整数配列 nums が与えられます。初期位置は nums[0] です。
各要素 nums[i] は、インデックス i から前方にジャンプする最大長を表します。つまり、nums[i] にいる場合、任意の nums[i + j] にジャンプできます:
0 <= j <= nums[i]
i + j < n
nums[n - 1] に戻ります。ジャンプ数。生成されたテスト ケースは nums[n - 1] に達する可能性があります。

例 1:

入力: nums = [2,3,1,1,4]
出力: 2
説明: 最後の位置に到達するための最小ホップ数は 2 です。
インデックス 0 からインデックス 1 にジャンプし、1 ステップジャンプし、次に 3 ステップジャンプして、配列の最後の位置に到達します。

例 2:

入力: 数値 = [2,3,0,1,4]
出力: 2

制限:

1 <= nums.length <= 104
0 <= nums[i] <= 1000
タイトルは nums[n-1] に達することが保証されています

アイデア:

分析:単純に最後までジャンプできるかどうかを問うleetcode55のジャンプ問題と比べると、この問題は最小のジャンプ数を求めており、難易度は相対的に高くなっています。
ジャンプの最小数を見つけるにはどうすればよいでしょうか? 毎回最大ステップ数を移動すると、ジャンプ数を最小ジャンプ数に減らすことができます。これが、この質問で貪欲アルゴリズムの使用ポイントです。
アイデア: 開始点を参照点として使用し、for ループを介して現在の最大範囲を順次比較して記録します。このとき、添え字が記録された最大範囲と等しい場合は、回数に 1 を加えて次の値に移動します。インデックスの位置。
特定の完全なコード:

class Solution {
    
    
    public int jump(int[] nums) {
    
    
        if(nums == null || nums.length ==0 || nums.length ==1){
    
    
            return 0;
        }
        
        int count = 0;
        int cur = 0;
        int max = 0;
        for(int i =0;i<nums.length;i++){
    
    
            max = Math.max(max,i+nums[i]);
            if(max>=nums.length-1){
    
    
                count++;
                break;
            }
            5 4 3 2 1 1 1
            if(i == cur){
    
    
                cur = max;
                count++;
            }
        }
        return count;
    }
}

私に従ってください、毎日のアルゴリズムの自己規律チェックインを完了してください。開始するのに遅すぎることはありません! !

おすすめ

転載: blog.csdn.net/weixin_54174102/article/details/129704319