2019年6月1日午前17時09分30秒
問題の説明:
問題解決:
実際には、これは自然に数学の問題です。
[定理]
円の周りに配列、この配列要素から、非負の状態の保証を蓄積することができた:配列をループするため、全体のアレイとSUM> = 0の場合、そこ配列におけるそのような要素を見つけなければなりません。
[証明]
真ん中のための第1および図からスタートし、最小の累積ポイントがなければならない、我々は、xを設定します。最終合計> = 0。
今、私たちは、その後の状態で非負が存在する必要があり、バックのx蓄積からであり、最後のサイトにいくつかの余剰があるでしょう、その後、負の数にバインドすることは、最低点xマーチングから開始することは表示されません。
【Leetcode議論】
すべての合計が場合
gas[i]-cost[i]
以上に等しく0
、その後、あなたは全体の円を移動することができ、開始位置があります。
ましょうi
、そのような部分和、そのインデックスも
gas[0]-cost[0]+gas[1]-cost[1]+...+gas[i]-cost[i]
最小で、その後、開始位置はでなければならない
start=i+1
(start=0
場合i=n-1
)。例えば、他の部分和を考えてみましょう、
gas[0]-cost[0]+gas[1]-cost[1]+...+gas[i]-cost[i]+gas[i+1]-cost[i+1]
以来
gas[0]-cost[0]+gas[1]-cost[1]+...+gas[i]-cost[i]
最小で、我々は持っている必要があります
gas[i+1]-cost[i+1]>=0
ためには
gas[0]-cost[0]+gas[1]-cost[1]+...+gas[i]-cost[i]+gas[i+1]-cost[i+1]
大きいこと。
同じ理由であること与えます
gas[i+1]-cost[i+1]>=0 gas[i+1]-cost[i+1]+gas[i+2]-cost[i+2]>=0 ....... gas[i+1]-cost[i+1]+gas[i+2]-cost[i+2]+...+gas[n-1]-cost[n-1]>=0
どのようなラップアラウンド部分和のためには?
gas[0]-cost[0]+gas[1]-cost[1]+...+gas[j]-cost[j] + gas[i+1]-cost[i+1]+...+gas[n-1]-cost[n-1] >= gas[0]-cost[0]+gas[1]-cost[1]+...+gas[i]-cost[i] + gas[i+1]-cost[i+1]+...+gas[n-1]-cost[n-1] >=0
最後の不平等は全体の合計があるという仮定に起因して
gas[k]-cost[k]
0以上である
ので、我々はすべての部分和することを持っています
gas[i+1]-cost[i+1]>=0, gas[i+1]-cost[i+1]+gas[i+2]-cost[i+2]>=0, gas[i+1]-cost[i+1]+gas[i+2]-cost[i+2]+...+gas[n-1]-cost[n-1]>=0, ... gas[i+1]-cost[i+1]+...+gas[n-1]-cost[n-1] + gas[0]-cost[0]+gas[1]-cost[1]+...+gas[j]-cost[j]>=0, ...
このように
i+1
開始する位置です。
あなたが発生した場合、状況はその後、到達できない、コスト> = 0 yesの場合、唯一の配列を反復処理する必要があり、この文脈では、解決策が存在しなければならない - ?したがって、この問題のために、我々はガスの合計かどうかを計算することができます再びスタートに到達することはできません最初から計算することができます。
公共INT canCompleteCircuit(INT []ガス、INT []コスト){ int型のn = gas.length。 int型の合計= 0; [i]はコスト-総和+ =気体[i]は、式(I ++; iがN <I = 0 INT)のため (和<0)を返す場合は-1。 INT = 0を起動します。 int型のタンク= 0; 以下のために(INT i = 0; iがn <; iは++){ タンク+ =気体[I]。 場合(タンク<コストは[I]){ START = I + 1。 タンク= 0; } 他{ タンク- =コスト[i]は、 } } 開始返します。 }