Gas Station


这个问题网上的最简单版本的确是简单的一塌糊涂,O(n)的复杂度,我们来理一理这种简单的思路。

假设A的每个月的工资和花费是固定的,而且每年都是不变。如果到了第 i 个月发现自己的积蓄不足以满足花费的时候,当然这日子就没法过了。现在A要交个女朋友,但交女朋友有条件,必须在他们认识后的第一个九月份买个苹果5土豪金,我们帮他看下,以他的工资和花费情况,在几月份开始交女朋友,能够保证满足女友的要求,抱的佳人归。

假设A在一月份认识了个女孩,最终发现自己能活到九月就已经很勉强了,更别说金了,所以A在今年的九月份之前的任何一个月交女友都不行,为何,因为每个月至少收支平衡才能到下个月,所以既然坚持到九月份了,说明这期间的每个月的所剩都不是负的,那么少了任何一个月 i,最终的积蓄都少了,就更买不起了。所以只能在九月份以后的月份开始认识女孩才有可能,当然A最希望在下个月 10月份就认识,因为10月份是潜在的可能性。以便下一年的九月份能买的起。当然如果转一圈都发现买不起,那就算了,洗洗睡吧哥们,只能帮你到这了。

class Solution {
public:
    int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
        if(gas.size() == 0) return -1;
        int total = 0;
        int cur_sum = 0;
        int start_po = 0;
        for(int i = 0; i < gas.size(); ++i)
        {
            cur_sum += gas[i] - cost[i];
            total += gas[i] - cost[i];
            if(cur_sum <  0){
                cur_sum = 0;
                start_po = i + 1;
            } 
        }
        if(total < 0) return -1;
        return start_po;
    }
};

程序中的total就是全年的收支情况,若资不抵债,那就怎么开始都没办法了,cur_sum就是到目前为止的情况,若在某个 i 处,该值为负,那起始位置就只能从下个位置开始。


你可能感兴趣的:(LeetCode,Algorithm,Station,gas)