貪欲アルゴリズム(も貪欲アルゴリズムとして知られている)問題解決には、常に最良の選択であることを、現在表示されてなされたものであることを意味します。言い換えれば、最高の全体として考慮されていない、彼は地元の意味での最適解である作りました。
貪欲アルゴリズムの古典的な場合:
ジャンプのゲーム:
非負整数配列を考えると、あなたは最初に、配列の最初の位置にあります。配列の各要素は、あなたがその位置にジャンプすることができた最大の長さを表しています。あなたの目標は、配列の最後の位置に到達するためのホップの最小数を使用することです。
例えば:[2,3,1,1,4,2,2,1]明らかに、最短ルート:2スキップ位置3、および次いで最後にスキップすることができ、位置4にジャンプ。
:(緑の円を考えアルゴリズムは、現在の位置を示し、オレンジ)の最大距離を達成することを示し
2オレンジ色の位置を達成するために、最初の番号から始まります。あなたは最も遠い位置の変更に達することができます。
緑は最も遠い位置に到達することができ、この位置はオレンジ4の位置、最も遠い位置の変更に加え、ステップ数となり、3位に入りました。
この位置は、オレンジ色の最も遠い位置劣る位置4に到達することができ、緑色の1位を行くために続けて、最も遠い位置には、ステップの同じ番号を変更しません。
この位置は、オレンジ色の最も遠い位置劣る位置4に到達することができ、緑色の1位を行くために続けて、最も遠い位置には、ステップの同じ番号を変更しません。
この位置は位置1オレンジ、最も遠い位置の変更に加え、ステップ数に最も遠い位置に到達することができます。緑色の4位を行くことを継続し、終了、サイクルの終わりに達しました。
アルゴリズム:
時間の複雑さ:O(N-)O (N- )。
宇宙複雑:O(1)O (1。 )。
コードは以下の通りであります:
パブリック クラスSubject92 { 公共 静的 ボイドメイン(文字列[]引数){ INT [] = arrInt 新しい新規 のint [] {2,3,1,1,4,2,1 }; のSystem.out.println(新しい新しいSubject92() .jump(arrInt)); } 公共 int型のジャンプ(INT [] NUMS){ // 未満または1に等しいジャンプする必要はありません INT長= nums.length; IF(長さ<= 1 ){ 戻り 0 ; } int型 REACH = 0; // 現在は最も遠い距離に行くことができます int型NUMS = nextreach [0 ]; INT STEP = 0; // ステップの必要な数 のために(INT I = 0; I <長さ、I ++ ){ // 貪欲アルゴリズムコア:このステップは、ステップの段差の数よりも得ることができません、あなたは、新しいルートを取ることができます。 = Math.max nextreach(I + NUMS [I]、nextreach); IF(nextreach> = -lengths 1)リターン(+ STEP 1。); IF(I == REACH){ STEP ++ ; REACH = nextreach; } } 戻りSTEP; } }
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/jump-game-ii:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。