負でない整数の配列を指定すると、最初は配列の最初の位置にいます。
配列の各要素は、その位置でジャンプできる最大の長さを表します。
最後の位置に到達できるかどうかを判断します。
例1:
入力:[2,3,1,1,4]
出力:true
説明:位置0から位置1に1ステップジャンプしてから、位置1から最後の位置に3ステップジャンプできます。例2:
入力:[3,2,1,0,4]
出力:false
説明:何があっても、常にインデックス3に到達します。ただし、この位置の最大ジャンプ長は0なので、最後の位置に到達することはできません。
一見すると、この問題は動的プログラミングによって実現されます。この問題の後の最初のアイデアは、ダブルトラバースで各位置に到達できるかどうかを判断することです。アイデアは次のとおりです。
class Solution {
public:
bool canJump(vector<int>& nums) {
vector<int> dp(nums.size(),0);
if(nums.size()<2)return true;
dp[0]=1;
for(int i=0;i<nums.size();i++){
if(dp[i]==0)continue;
for(int j=0;j<=nums[i];j++){
if(i+j>=nums.size()) continue;
dp[i+j]=1;
}
}
return dp[nums.size()-1]==1;
}
};
しかし、場合によっては残業であり、この問題をそれほど激しく解決することはできません。実際、中間位置に到達できるかどうかは問題ではありません。最も遠いところに移動できるかどうかを考慮する必要があるため、データを使用して到達可能な最大位置を格納します。この位置が最後の位置よりも後ろにある場合、最後の位置が到達可能で、途中で到達できない場合は直接終了します。各最大更新では、現在到達可能な最大距離とアレイが到達可能な最大距離を比較することもできます。
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()<2)return true;
int max=0;
for(int i=0;i<nums.size()-1;i++){
if(max<i)break;
max=max>(nums[i]+i)?max:(nums[i]+i);
}
return max>=nums.size()-1;
}
};