leetcode 134 加油站

/方法1

​
// class Solution {
// public:
//     int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
//         //暴力解法,时间复杂度n^2  超时
//         //思路:遍历每一个点,跑一圈,如果油量>=0,这个加油站可行
//         for(int i=0;i<gas.size();i++){
//             int res=gas[i]-cost[i];//剩余油量
//             int index=(i+1)%cost.size();
//             while(res>0&&index!=i){
//                 res+=gas[index]-cost[index];
//                 index=(index+1)%cost.size();
//             }
//             if(res>=0&&index==i){
//                 return i;
//             }
//         }
//         return -1;
//     }
// };

​

方法2

// class Solution {
// public:
//     int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
//         //从全局最优解出发
//         //1.如果油的总和小于花费的总和一定是没有答案的
//         //2.如果从0开始累加到最后,最小值是正数,说明可以从0到最后,那么这是一个可行的点
//         //3.如果累加到最后最小值是负的,说明这个点不是从0点出发,从后往前找看看能不能填平
//         int cursum=0;
//         int min=INT_MAX;
//         for(int i=0;i<gas.size();i++){
//             int rest=gas[i]-cost[i];
//             cursum+=rest;
//             if(cursum<min){
//                 min=cursum;
//             }
//         }
//         //第一种
//         if(cursum<0)return -1;
//         //第二种
//         if(min>0)return 0;
//         //第三种   填平
//         for(int i=gas.size()-1;i>=0;i--){
//             int rest=gas[i]-cost[i];
//             min+=rest;
//             if(min>=0)return i;
//         }
//         return -1;
//     }
// };

方法3

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;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值