問題の説明
非負整数配列を考えると、あなたは最初に、配列の最初の位置にあります。配列の各要素は、あなたがその位置にジャンプすることができた最大の長さを表しています。あなたが最終位置に到達することができるかどうかを判断するには。
ソリューション
我々は最後の、そしてまた、対応する判断にジャンプすることが可能な第1の真ん中にジャンプするかどうかを知ることができれば質問は、最初と最後からジャンプするように頼ま
バックから前方動的計画ジャンプの仕方によって*、現在の裁判官位置は最後の要素にスキップできるかどうか、それは最初の要素と判定されました。
各要素が正しいと、その要素を参照する必要があるため*はO(n ^ 2)の時間計算量は、右側の素子は、nまで達します。
*スペースの複雑さはO(n)は、DPの配列を開くだけです。
コード・プレゼンテーション
1 パブリック 静的 ブール canJump(INT [] NUMS){ 2 INTの長さ= nums.length。 3 であれば(長さ== 0){ 戻り 真。} 4つの ブール [] DP = 新しい ブール[長さ]。 5 Arrays.fill(DP、偽)。 6 DP [長-1] = 真。 7 8 のための(int型 I =長-2; I> = 0; i-- ){ 9 もし(NUMS [I]> =長-I-1 ){ 10 DP [I] = 真。 11 続け; 12 } 他{ 13 のために(INT J = NUMS [i]は、J> = 0; j-- ){ 14 場合(DPは[iが+ J]){ 15 DP [I] = 真。 16 ブレーク; 17 } 18 } 19 } 20 } 21 のための(ブール:DP)を{ 22 System.out.print(A + ""); 23 } 24 のSystem.out.println(); 25 リターン DP [0]。
コードの改良
我々はGOOD左端の位置(最後の要素に到達する位置)を記録するために別の変数を使用する場合は、それらは電流を横断するとき、あなたはDPの配列全体、および最もすべての要素を省略することができる配列要素の全体の右側を検索しません。一度トラバース。
O(N)の時間計算量は、空間的複雑度はO(1)です。1 公共 ブール canJump2(INT [] NUMS){ 2 INT LastPos機能= nums.length - 1 。 3 用の(int型 I = nums.length - 1; I> = 0; i-- ){ 4 もし(iはNUMSを+ [I]> = LastPos機能){ 5 LastPos機能= 私は、 6 } 7 } 8 リターン LastPos機能== 0 。 9 }