[力扣题解]134. 加油站

题目:134. 加油站

思路

贪心法;

代码

暴力法

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int i, rest, index, size;
        size = gas.size();
        for(i = 0; i < size; i++)
        {
            // 从 i 开始
            // 油量储备
            rest = gas[i] - cost[i];
            index = (i + 1) % size;
            // 有油且未到达终点
            while(rest > 0 && index != i)
            {
                rest = rest + gas[index] - cost[index];
                index = (index + 1) % size;
            }
            if(rest >= 0 && index == i)
            {
                return i;
            }
        }
        return -1;
    }
};

本题应该设置了时长限制,所以暴力法超时了;

贪心 Method 1

// 代码随想录: 贪心 Method 1
//
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int min = INT_MAX; // 从起点出发,邮箱里的油量最小值
        int i, rest;
        for(i = 0; i < gas.size(); i++)
        {
            cout << "i : " << i;
            rest = gas[i] - cost[i]; // 这一天剩下的油
            curSum += rest;          // 现在的油
            cout << ", curSum : " << curSum;
            if(curSum < min)
            {
                min = curSum;
            }
        }
        // 情况1:跑不了一圈
        if(curSum < 0)
        {
            return -1;  
        }
        // 情况2:
        if(min >= 0)
        {
            return 0;
        }

        for(i = gas.size()-1; i >= 0; i--)
        {
            rest = gas[i] - cost[i];
            min += rest;
            if(min >= 0)
            {
                return i;
            }
        }
        return -1;
    }
};

贪心 Method 2

// 贪心 Method 2
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int i;
        int totalsum = 0, cursum = 0, start = 0;
        for(i = 0; i < gas.size(); i++)
        {
            cout << ", i : " << i;
            cursum += gas[i] - cost[i];
            totalsum += gas[i] - cost[i];
            cout << ", cursum : " << cursum;
            // 没油了, 重来
            if(cursum < 0)
            {
                start = i+1; // 题目条件有“如果有解存在唯一解”
                cursum = 0;
                cout << ", start : " << start;
            }
            cout << endl;
        }
        // 没戏了
        if(totalsum < 0)
        {
            return -1;
        }
        return start;
    }
};

看不懂代码的时候,就手动输出调试;(像上面那样)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值