45.ジャンパーIIバックルLeetCode力

タイトル説明(難易度)

0からアレイ内の開始位置をジャンプし、ジャンプ距離は、対応するアレイ上の数に等しい未満です。位置のために必要なステップの最短数を最後までスキップして得られました。例えば、上の図は、2 0番目の位置であり、それは離れた距離、又は両者をジャンプすることができ、我々は距離3上にある場所にジャンプする最初のものをジャンプすることを選択しました。その後、我々は、我々が直接最後まで、からジャンプすることを選択した1の距離、2、3をジャンプすることができます。2段階の合計ので。

より深い調査へのソリューション

リファレンスここでは、このアイデア、貪欲アルゴリズムのほとんどは、我々は範囲内の各を選択することができるleetCode議論ジャンプ離れた位置をジャンプさせることができます。

以下は、開始位置が2で、範囲がオレンジ色にジャンプすることができます。その後、3以来の3位にジャンプして、遠くにジャンプすることができます。

以下、現在位置が3であり、範囲をジャンプすることができオレンジ、その後4のように遠くジャンプすることができるので、次の位置4に進んでください。

我々は終了し、コードを書き込み電流が境界をジャンプすることができ表し、最初のグラフの上にオレンジ色のいずれかの、2番目の図は、オレンジ4、配列をループは、境界に、我々は再び更新され、新たな境界です。

public int jump(int[] nums) {
    int end = 0;
    int maxPosition = 0; 
    int steps = 0;
    for(int i = 0; i < nums.length - 1; i  ){
        //找能跳的最远的
        maxPosition = Math.max(maxPosition, nums[i]   i); 
        if( i == end){ //遇到边界,就更新边界,并且步数加一
            end = maxPosition;
            steps  ;
        }
    }
    return steps;
}

時間の複雑さ:O(n)を。

複雑スペース:O(1)。

詳細はここで留意されるべきであるforループ、I <nums.length - 1、より少ないエンド。ボーダーの始まりは0番目の位置であるので、ステップは1に追加されました。次の図は、最後のステップの終わりにちょうどジャンプの場合は、1を追加していない、という事実を繰り返します。私は<nums.length、私は最後の時間に通過した場合は文が、より多く支払うことになる1ステップた場合、入力します。

対処方法2シスタッチメロンのつる

私たちは、その最も遠い場所を見つけることですから、最終的には最後の位置に到達した後、我々は、配列を、前の位置を見つけ、その範囲の場所を見つけることを知っています。そして、最後の位置に探し続ける、そして最終的に0番目の位置に終わりました。

それから離れて遠い位置については、実際には、我々は我々が探している位置の左から右へ、最初の出会いから繰り返します。

public int jump(int[] nums) {
    int position = nums.length - 1; //要找的位置
    int steps = 0;
    while (position != 0) { //是否到了第 0 个位置
        for (int i = 0; i < position; i  ) {
            if (nums[i] >= position - i) {
                position = i; //更新要找的位置
                steps  ;
                break;
            }
        }
    }
    return steps;
}

時間計算量:O(n²)、最悪の場合のような1 1 1 1 1 1、5-0からの位置更新、および各更新は、forループ経験します。

複雑スペース:O(1)。

このアイデアは、より簡単に、なぜ仕事ですか?私たちは、そう考えることができます。

> 3 - - > 4 - > 1で左から右、2にジャンプ。

右から左に、私たちは左端の位置1へのジャンプを見つけることができ、我々はわずか4か4左を見つけます。

4つの言葉は完璧、言うまでもないました。

最初の二つのミッドレンジ3に3 1〜4あれば、この位置はまた、我々は3を見つけることができる私達のアルゴリズムに従って、1の最後にジャンプすることができる、図4は、左の位置です。しかし、それは実際にはこの数は3-4ミッドレンジの数であるため、図3はまた、次回はそれを見つけるためになるよう、左の境界に境界線3、または3の数を見つけるだろう、この番号の左端に移​​動することができ、私たちのステップに影響を与えません。まっすぐに境界2、それだろうか?境界2に見つかった場合いいえ、それは2から3と4の間の数に直接ジャンプし、それちょうど2つのステップの終わりに数からジャンプすることを意味するが、実際には3つのステップを必要と。

全体的な

ブラシのように多くの質問、最初の貪欲アルゴリズムに遭遇し、局所最適を見つけるたびに、そして最終的に大域的最適に、完璧!

人気のより詳細な説明についてはleetcode.wang

公開された61元の記事 ウォン称賛7 ビュー20000 +

おすすめ

転載: blog.csdn.net/wind_liang/article/details/104013888