Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

First I thought of a DP solution.. but TLE. So there must be a O(n). I thought of Mono-Queue.. but looks too complex.

So what is the naive solution? O(n^2) of course. If we pick next start station smartly, we can make it linear: http://blog.csdn.net/kenden23/article/details/14106137

Smart idea... I need practice more and think more....

class Solution {
public:
    int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
        size_t cnt = gas.size();
        if (cnt == 1)
        {
            if (gas[0] >= cost[0]) return 0;
            return -1;
        }

        for (int i = 0; i < cnt; i++)
        {
            int delta = 0;
            int step;
            bool bFound = true;
            for (step = 0; step < cnt - 1; step++)
            {
                delta += gas[(i + step) % cnt] - cost[(i + step) % cnt];
                if (delta < 0)
                {
                    i += step;
                    bFound = false;
                    break;
                }
            }
            if (!bFound) continue;
            if (delta > 0) return i;
            else i += step - 1;
        }

        return -1;
    }
};
posted on 2014-08-21 13:23  Tonix  阅读(170)  评论(0)    收藏  举报