トピック:
非負整数配列を考えると、あなたは最初に、配列の最初の位置にあります。配列の各要素は、あなたがその位置にジャンプすることができた最大の長さを表しています。あなたの目標は、配列の最後の位置に到達するためのホップの最小数を使用することです。
例:
入力:[2,3,1,1,4]
出力:2
説明:ホップの最小数は、最後の位置にジャンプが2です。
、インデックスにインデックス0から1の位置、1段ジャンプジャンプジャンプし、ステップ3は、アレイの最後の位置に到達します。
説明:
あなたと仮定すると、常に配列の最後の位置に到達することができます。
アイデアは、(各ステップは、最も遠い距離をジャンプすることができ、各ステップを見つけ、その後、ジャンプしなければなりません)
範囲の範囲を決定することができ、現在のホップホップホップを活用することができ、nums.sizeオーバー次回ジャンプ範囲() - 1、終了!
ホップ数がかなり要求のパスをジャンプよりも、範囲を決定することができるので、直接次のホップ!
Iは、+ 1ホップ範囲:私は〜1 +最大距離のi番目のホップが最も遠い距離の各点までのホップ。
各アクセスポイントに一度だけ、O(N)の時間計算量はO空間的複雑度(1)
コード;
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()<=1) return 0;
int step=0, start=0,reach=0;
while( reach <nums.size()-1 ){
int farest=0;
for(int i=start; i<=reach; ++i)
farest=max(farest,i+nums[i]);
start=reach+1;
reach=farest;
step++;
}
return step;
}
};