タイトル説明
https://leetcode-cn.com/problems/jump-game/
解決
dpを使用してそれを行うことを考えているのに、なぜdp配列が定義されているのですか?
- 変数とは何ですか?ジャンプするたびに、到達する位置が異なり、各位置でジャンプできるステップ数も異なります。dpをどのように定義しますか?
- 明らかに、dpを使用して各位置でジャンプできるステップ数を表すため、到達する位置のみを選択できます。したがって、dp [i]は、0からiまでの添え字に到達できるかどうかを示します。
- 再帰について考えると、現在のdp [i]は、前の位置から到達できるかどうかによって異なります。現時点で到達できる最大の添え字を表す変数を維持する必要があります。現在の添え字が到達可能な最大範囲内にある場合下付き文字の範囲内(1ステップをスキップできるため)、それはtrueなので、maxを更新します
- 境界はdp [0] = trueです。
- コードを書く
class Solution {
public boolean canJump(int[] nums) {
boolean []dp = new boolean[nums.length];//表示从0到下标i的是否可以到达
dp[0]=true;
int max = 0+nums[0];//当前能抵达的最大下标
for(int i=1;i<nums.length;i++){
if(max>=i){
dp[i] = true;
if(nums[i]+i>max)
max = nums[i]+i;//更新能抵达的最大下标
}
//else dp[i] = false;//不能抵达
}
return dp[nums.length-1];
}
}
dpの使用に応じて、スペースの複雑さを最適化できます。
class Solution {
public boolean canJump(int[] nums) {
//boolean []dp = new boolean[nums.length];//表示从0到下标i的是否可以到达
boolean res = true;//dp[0]等于true
int max = 0+nums[0];//当前能抵达的最大下标
for(int i=1;i<nums.length;i++){
if(max>=i){
res = true;
if(nums[i]+i>max)
max = nums[i]+i;//更新能抵达的最大下标
}else
res = false;
}
return res;
}
}
欲張りアルゴリズムが使用されている場合はどうなりますか?
変換の質問:質問のジャンプルールを渡すことで、どこまでジャンプできますか?最後の正方形を横切ることができる場合はtrueを返し、そうでない場合はfalseを返します。
したがって、次の貪欲なコードを書くことができます。
int n = nums.length;
int farthest = 0;
for (int i = 0; i < n - 1; i++) {
// 不断计算能跳到的最远距离
farthest = max(farthest, i + nums[i]);
// 可能碰到了 0,卡住跳不动了
if (farthest <= i) return false;
}
return farthest >= n - 1;
上記のコードに類似していることがわかりましたが、欲張りプログラミングと動的計画法の次の違いについて考えることができますか?