leetcode-卡车加气走环

解析:

    a1 a2 a3 a4 a5 a6

    如果a1到a3总的加气-用气<0,那么a1,a2都不能用作起点,a3作为起点


//复杂度O(n)
class Solution {
public :
     int canCompleteCircuit(vector< int > &gas, vector< int > &cost) {
         //total记录全局是否有解,sum记录i到i+1是否可行
         int total = 0, sum = 0;
         int index = -1;
         for ( int i = 0; i < gas.size(); i++) {
             sum += gas[i] - cost[i];         //本次消耗
             total += gas[i] - cost[i];   //总消耗
             if (sum < 0) {
                 sum = 0;
                 index = i;     //记录解的位置
             }
         }
         return total >= 0 ? index + 1 : -1; //只要total>=0,肯定有解
     }
};

有一个没看到答案,记录下

从start出发, 如果油量足够, 可以一直向后走 end++;  油量不够的时候,
start向后退  最终 start == end的时候,如果有解一定是当前 start所在位置
class Solution {
public :   int canCompleteCircuit(vector< int > &gas, vector< int > &cost) {      
         int start = gas.size() - 1;
         int end = 0;
         int sum = gas[start] - cost[start];
         while (start > end){
             if (sum >= 0){
                 sum += gas[end] - cost[end];
                 ++end;
             } else {
                 --start;
                 sum += gas[start] - cost[start];
             }
         }
         return sum >=0 ? start : -1;
         
         
     }
};


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值