[Leetcode]ガソリンスタンドの問題

タイトル説明:

環状道路にはn個のガソリンスタンドがあり、i番目のガソリンスタンドのガソリン量はgas [i]です。あなたは車を持っていて、その燃料タンクは無制限のガソリンで満たすことができます。ガソリンスタンドiから次のガソリンスタンド(i + 1)まで歩くコストはcost [i]です。ガソリンスタンドから始めて、最初はタンクにガソリンがありません。環状道路を歩くことができるガソリンスタンドを尋ねます。ガソリンスタンドの下付き文字を返します。応答がない場合は-1を返します。

注:答えは一意であることが保証されています。

環状ルートにはNのガソリンスタンドがあり、ステーションiのガスの量はgas [i]です。無制限のガソリンタンクを備えた車があり、ステーションiから次のガソリンスタンドに移動するにはガスのコスト[i]がかかりますステーション(i + 1)。ガソリンスタンドの1つで空のタンクから旅を開始します。サーキットを1度移動できる場合は、開始のガソリンスタンドのインデックスを返します。それ以外の場合は-1を返します。

注:ソリューションは一意であることが保証されています。

問題分析:

1.すべてのガソリンスタンドからガソリンの総量を差し引くことで、環状道路を円で歩くことが可能かどうかを判断でき、そうでなければ-1を返す。

2. i番目のガソリンスタンドに到着する燃料の残量が合計であるとすると、i番目のガソリンスタンドでのガソリンガスの量[i]を加算し、次のステーションに行くために費やされたガスの量(i + 1)のコストを差し引きます[ i]、i番目のガソリンスタンドから次のガソリンスタンドに到達できるかどうかを判断できる。

3.現在の位置が前進をサポートしていない場合は、次のガソリンスタンドを出発点として変更します。

4.解決策がある場合は、それが唯一の解決策であり、ガソリンスタンドの場所に戻ります(1から数えます)。

アルゴリズムの分析:

貪欲な思考はこの問題を解決するために使用することができ、核心は開始のための検索です。最初のガソリンスタンドから始めて、要件に準拠していない場合は、要件を満たしていないガソリンスタンドから始めます。前の計算から、最初のガソリンスタンドがこの場所に到達可能であることがわかります。この場所から始めると、最後に到達すると、ラウンドアバウトを歩くことができます。アルゴリズムの時間の複雑さはO(n)です。

コーディングの実装:

public class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int sum = 0, start = -1, total = 0;
		for( int i=0; i<gas.length; i++) {
			sum += gas[i]-cost[i];
			total += gas[i]-cost[i];
			if(sum<0) {
				sum = 0;
				start = i;
			}
		}
		return total>=0 ? start+1:-1;
    }
}

 

おすすめ

転載: blog.csdn.net/VinWqx/article/details/104907324