leetcode 134 加油站

简介: leetcode 134 加油站

加油站


3ded3af4c50f4deeb0fe926b3aad406d.png1115ca972013478185a6d0f02907f629.png

先找可能存在开始点,再验证(超时)

先找到所有加油比消耗大的站点,是可能的开始点

然后依次验证上述点,发现油箱是负数的该点无效。发现科研走到开始点前一个并能到下一个的成功

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int volume = 0;
        vector<int> start;
        for(int i=0 ; i<gas.size() ;i++)
        {
            if(gas[i] >= cost[i]) start.push_back(i); //找到可能开始的点
        }
        for(int i=0 ; i < start.size() ;i++)
        {
            int result = start[i];
        //    cout<<"result:"<<result<<endl;
            for(int j = result ; j <= gas.size(); j++) //验证点是否正确
            {
                if(j == gas.size()) j = 0; //循环数组
                volume += gas[j];
                volume -= cost[j];
                // cout<<j<<' '<<volume<<endl;
                if(volume < 0 )  //检查油箱
                {
                    volume=0;
                    break;
                }
                if((result == 0 && j== gas.size()-1 && volume >= 0)
                    ||(result!=0 && j == result-1 && volume >= 0 ) ) //验证点成功
                    return result;
            }
        }
        return -1;
    }
};

贪心算法

8b1777d51c5e4e72a19afec383f994c5.png

4625f682dcf6437d9e7f403dd12828e0.png

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) {   // 当前累加rest[i]和 curSum一旦小于0
                start = i + 1;  // 起始位置更新为i+1
                curSum = 0;     // curSum从0开始
            }
        }
        if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
        return start;
    }
};

二刷

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


相关文章
|
6月前
leetcode-134:加油站
leetcode-134:加油站
41 0
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】134. 加油站
LeetCode "加油站" 问题的Python实现代码,采用了一种优化的贪心算法。代码中通过两个指针i和j来模拟汽车的行驶过程,remain变量用来记录当前剩余油量。如果在某次循环中能够回到起始点i,则返回起始点索引;如果无法完成一圈,则移动到下一个可能的起始点继续尝试,直到找到可行的起始点或确定无法绕圈。如果整个过程结束后仍未找到解决方案,则返回-1。
32 0
|
5月前
|
算法 数据可视化 数据挖掘
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
|
6月前
|
索引
【力扣】134.加油站
【力扣】134.加油站
|
6月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 134. 加油站 算法解析
☆打卡算法☆LeetCode 134. 加油站 算法解析
|
算法 网络架构
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
55 0
|
算法
代码随想录Day28 贪心03 LeetCode T1005 K次取反后最大化的数组和 LeetCode T134 加油站 LeetCode T135 分发糖果
代码随想录Day28 贪心03 LeetCode T1005 K次取反后最大化的数组和 LeetCode T134 加油站 LeetCode T135 分发糖果
35 0
leetcode每日一题:134. 加油站
leetcode每日一题:134. 加油站
|
算法 Java 网络架构
加油站(LeetCode 134)
加油站(LeetCode 134)
98 0
|
算法 Java C++
代码随想录刷题|LeetCode 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
代码随想录刷题|LeetCode 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果