限界思考を使用して 134 を突破します。 ガソリン スタンド - LeetCode アルゴリズム

トピック: 134. ガソリンスタンド

ループ上には n 個のガソリン スタンドがあり、i 番目のガソリン スタンドには、gas[i] リットルのガソリンがあります。
燃料タンクの容量が無制限の車を所有しており、i 番目のガソリン スタンドから i+1 番目のガソリン スタンドまで移動するには、コスト [i] リットルのガソリンが必要です。ガソリンスタンドの1つから、空のタンクからスタートします。
ガスとコストの 2 つの整数配列を指定すると、円を一周できる場合は出発時のガソリン スタンドの番号を返し、そうでない場合は -1 を返します。ソリューションが存在する場合、それは一意であることが保証されます。

例 1:
入力: ガス = [1,2,3,4,5]、コスト = [3,4,5,1,2]
出力: 3
説明:
ガソリン スタンド 3 番 (インデックス 3) から開始し、ガソリンを4リットル用意してください。このとき燃料タンクのガソリンは = 0 + 4 = 4 リットル
4 番ガソリンスタンドへ このとき燃料タンクのガソリンは 4 - 1 + 5 = 8 リットル
0 番ガソリンスタンドへガソリン スタンド、この時点で燃料タンクには 8 - 2 + 1 = 7 リットルのガソリンがあります。
1 番のガソリン スタンドに行きます。この時点で燃料タンクには 7 - 3 + 2 = 6 リットルのガソリンがあります
。 2 番目のガソリン スタンド、この時点で燃料タンクには 6 - 4 + 3 = 5 リットルのガソリンがあります。
3 番目のガソリン スタンドに行きます。あなたは 5 リットルのガソリンが必要です。3 番目のガソリン スタンドに戻るのにちょうど十分です。
したがって、3 を開始インデックスにすることができます。

例 2:
入力: ガス = [2,3,4]、コスト = [3,4,3]
出力: -1
説明:
十分なガソリンがないため、ガソリン スタンド 0 または 1 から開始することはできません。次のガソリンスタンド。
ガソリンスタンド 2 からスタートし、4 リットルのガソリンを入手します。このとき、燃料タンクには = 0 + 4 = 4 リットルのガソリンが入って
います。 0 番のガソリンスタンドに行きます。 このとき、燃料タンクには 4 - 3 + 2 = 3 リットルのガソリンがあります。 1 番のガソリンスタンドに行きます
。ガソリン スタンドに行くと、燃料タンクには 3 - 3 + 3 = 3 リットルのガソリンが入っ
ています。 ガソリン スタンド 2 に戻ることはできません。帰りには 4 リットルのガソリンが必要ですが、タンクには 3 リットルのガソリンしかありません。
したがって、どうあっても環状線を車で走ることはできません。

リンク: https://leetcode-cn.com/problems/gas-station

理解して答える:

周回できるかどうかについては、次のような「エクストリーム モード」の考え方を使用できます。
1. 燃料 Gas[] の配列 Gas[] と燃料消費量の Cost[] 配列の合計が無限に小さい場合が無限に大きい場合、一周することは不可能です。 : (車が途中でガス欠になり、一周できなくなりました、泣きました~); 2. 給油量の配列の Gas[] が無限大の
場合大きく、燃料消費量のcost[]配列が無限に小さい場合、間違いなく一周することができます(車は無限に小さな円を歩くのに無限の量の燃料を使用します、とても簡単です〜)。

実際、アルゴリズムがわかりにくい箇所でも「極端な思考」を使えば数秒で理解できることが多いです。
ここに画像の説明を挿入
限界思考を使って理解しましょう。
ここに画像の説明を挿入

class Solution {
    
    
    /**
       采用极限思维秒破 
     */
    public int canCompleteCircuit(int[] gas, int[] cost) {
    
    
        int gasSum = 0;
        int costSum = 0;
        
        for (int g = 0; g < gas.length; g++) {
    
    
            gasSum += gas[g];
        }
        for (int c = 0; c < cost.length; c++) {
    
    
            costSum += cost[c];
        }
        // 只要中间有一个无限大的路程,有限的油必然被耗光
        if (gasSum < costSum) {
    
    
            return -1;
        }

        // 上方不能走完圈,下方必然存在一个能走完圈的
        int restGas = 0; // 剩余油量
        int start = 0;
        for (int i = 0; i < gas.length; i++) {
    
    
            restGas = restGas + gas[i] - cost[i]; // 剩余油量+本站油量 - 下一段路程油耗
            if (restGas < 0) {
    
     // 没有办法到达下一站,那么就尝试将下一站作为起点,万一下一站有无限的油量呢~
                restGas = 0;
                start = i + 1; 
            }
        }
        return start;
    }
}
/**
    https://leetcode-cn.com/problems/gas-station/solution/tan-xin-dong-hua-tu-jie-dai-ma-jian-ji-b-na6b/
 */

参照元: https:
//leetcode-cn.com/problems/gas-station/solution/tan-xin-dong-hua-tu-jie-dai-ma-jian-ji-b-na6b/
https://xiaochen1024 .com/courseware/60b4f11ab1aa91002eb53b18/61963ce5c1553b002e57bf14

おすすめ

転載: blog.csdn.net/Xidian2850/article/details/123836764