ジャンプゲーム1:
タイトル説明
負でない整数の配列が与えられると、最初は配列の最初の位置にいます。
配列の各要素は、その位置でジャンプできる最大の長さを表します。
最後の位置に到達できるかどうかを判断します。
例1:
入力:[2,3,1,1,4]
出力:true
説明:最初に1ステップジャンプし、位置0から位置1に到達してから、位置1から最後の位置に3ステップジャンプできます。
アイデア:
欲張り法:配列内の各位置を順番にトラバースし、到達可能な最も遠い位置をリアルタイムで維持します。到達可能な最も遠い位置が配列内の最後の位置以上である場合、最後の位置に到達できます。直接trueを返し、トラバーサル後も最後の位置に到達できない場合はfalseを返します
コード:
class Solution {
public boolean canJump(int[] nums) {
int temp = 0;
for(int i = 0;i<nums.length;i++){
if(i <= temp){
//注意:如果 i 比 temp 大的话,那说明跳过一个或一个以上的数字,相当于“断了”
temp = Math.max(temp,i+nums[i]);
//实时维护可以到达的最远位置
if(temp >= nums.length-1){
return true;
}
}
}
return false;
}
}
ジャンプゲーム2:
タイトル説明
負でない整数の配列が与えられると、最初は配列の最初の位置にいます。配列の各要素は、その位置でジャンプできる最大の長さを表します。目標は、最小数のジャンプを使用して配列の最後の位置に到達することです。
例:
入力:[2,3,1,1,4]
出力:2
説明:最後の位置へのジャンプの最小数は2です。
下付き文字0から下付き文字1の位置にジャンプし、1ステップスキップしてから、3ステップスキップして配列の最後の位置に到達します。
説明:
配列の最後の位置にいつでも到達できると仮定します。
アイデア:
配列の最後の位置に常に到達できると仮定します。中央に0がないのではなく、0を横切ることができるルートがあると仮定し
ます。欲張り法:
配列が[2の
開始位置であると仮定します。 、3,1,1,4,2,1]は2で、ジャンプ可能な範囲は3 1です。3はさらにジャンプできるため、3にジャンプし、3から再開します(step ++)
3から開始します。ジャンプ可能な範囲は1です。 1 4、4はより遠い位置にジャンプできるため、4にジャンプし、4からやり直します(step ++)
endを使用して、ジャンプできる範囲の境界を示します。上記の例では、最初はオレンジ色です1 、2回目はオレンジ4で、境界に移動するときに境界を更新します。
コード:
class Solution {
public int jump(int[] nums) {
// 假设总是可以达到数组的最后一个位置,不是说中间没有0 ,而是存在可以越过0 的路线
int len = nums.length;
int maxposition = 0;
int end = 0;
int step = 0;
for(int i = 0;i<len-1;i++){
//这里注意是遍历到len-1,因为起跳的时候step已经加一了,如果最后一次跳跃到达了最后一个位置,那么遍历到最后一个位置的时候就会再次起跳,所以不能遍历最后一个位置
maxposition = Math.max(maxposition,i+nums[i]);
if(i == end){
//最开始的时候,i = 0 ,end = 0,step++, 这里可以认为开始起跳必定会落下,因此跳跃次数+1
//假设nums[0] = 4 0+4=4 即最远位置为4 遍历[1,4]过程中,一直记录着最远位置4,在[1,4]之间的时候,一直记录着能够到达的最远位置,到达边界的时候,将end更新为k
//注意,[1,4]的最远位置必定不会在[1,4],因为如果在[1,4],表示根本出不了[1,4]这个圈
end = maxposition;
step++;
}
}
return step;
}
}