シリーズ: 貪欲アルゴリズム
言語: 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;
}
}
私に従ってください、毎日のアルゴリズムの自己規律チェックインを完了してください。開始するのに遅すぎることはありません! !