zoukankan      html  css  js  c++  java
  • 加油站

    题目链接:https://leetcode-cn.com/problems/gas-station/
    题目描述:

    题解:
    1.如果gas的总和小于cost总和,一定不能跑一整圈。
    2.每个加油站剩余量rest[i] = gas[i] - cost[i]
    3.i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。

    class Solution {
    public:
        int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
            int curSum = 0;
            int totalSum = 0;
            int start = 0;
            for(int i = 0; i < gas.size(); i++)
            {
                curSum += gas[i] - cost[i];   //累计当前剩余油量
                totalSum += gas[i] - cost[i];  //累计全程剩余油量
                if(curSum < 0)
                {
                    start = i + 1;
                    curSum = 0;
                }
            }
            if(totalSum < 0)
                return -1;
            return start;
    
        }
    };
    

    方法二:

    class Solution {
    public:
        int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
            int curSum = 0;
            int min = 0;
            for(int i = 0; i < gas.size(); i++)
            {
                int res = gas[i] - cost[i];
                curSum += res;
                if(curSum < min)
                    min = curSum;
    
            }
            if(curSum < 0) return -1;  //gas的总和小于cost总和
            if(min >= 0) return 0;      //从0累加到最后一站,没有出现负数,说明从0出发,可以环绕一圈
            for(int i = gas.size() - 1; i >= 0; i--)  //累加的最小值是负数,则需要从非0节点出发,从后向前遍历,能把负数抵消的节点就是出发节点
            {
                int rest = gas[i] - cost[i];
                min += rest;
                if(min >= 0)
                    return i;
                
            }
            return -1;
    
        }
    };
    
  • 相关阅读:
    P1726 上白泽慧音
    P1993 小k的农场
    P1983 车站分级
    P1525 关押罪犯【二分+二分图】
    P1268 树的重量【构造】
    P1113 杂务
    F.Three pahs on a tree
    P1522 牛的旅行
    两个约束下的dp问题
    dp 最大正方形
  • 原文地址:https://www.cnblogs.com/ZigHello/p/14882087.html
Copyright © 2011-2022 走看看