【贪心算法题记录】134. 加油站

题目描述

题目🔗

初始答案

思路都在注释里,不够超出时间限制了。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        /* 首先出发站startIndex获得的汽油要大于前往下一站要消耗的汽油
        *  也就是:gas[startIndex] >= cost[startIndex]
        *  将计算公式写出来就是:例如从startIndex = 3出发
        *  ((((0 + gas[3] - cost[3]) + gas[4] - cost[4]) + gas[0] - cost[0]) + gas[1] - cost [1]) + gas[2] - cost[2] = 0可以返回
        *  但是还有条件:每一次括号中的计算结果也要大于0
        */ 
        vector<int> v1(gas.size(), 0);
        for(int i = 0; i < gas.size(); i++){
            v1[i] = gas[i] - cost[i];
        }
        /* 上面的计算公式就变成了((((0 + v1[3]) + v1[4]) + v1[0]) + v1[1]) + v1[2] = 0
        *  那么下面我们根据条件“每一次括号中的计算结果也要大于0”来进行判断
        */
        
        // 首先判断整体和如果小于0,那么肯定不能环绕一圈
        if(accumulate(v1.begin(), v1.end(), 0) < 0) return -1;
        int result = -1;
        for(int i = 0; i < gas.size(); i++){
            // 找到第一个汽油大于0的加油站
            if(v1[i] < 0) continue;
            int num = gas.size();
            int k = i;
            int sum = v1[k];
            while(num--){
                if(k == gas.size() - 1){
                    sum += v1[0];
                    k = 0;
                }
                else sum += v1[++k];
                if(sum < 0) break;
            }
            if(sum >= 0) result = i;
        }
        return result;
    }
};

贪心版分析

很久没有做贪心算法题了,已经完全不记得咋做了orz…

首先这题的限制在于:每个站点的净剩余油量都要大于等于0,即rest[i] = gas[i] - cost[i] >= 0

那么i从索引0开始累加rest[i],其和记为curSum,一旦curSum小于0,则说明从0到i这个区间内,无论选择哪一个站点作为起始站点,走到i都会断油,那么我们这时就可以选择i+1作为起始开始重新计算。

将上述分析总结就是:
局部最优:curSum一旦小于0,起始位置至少要是i+1才能满足条件。
全局最优:可以找到能跑一圈的起始位置。

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 09:20:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 09:20:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 09:20:04       45 阅读
  4. Python语言-面向对象

    2024-07-12 09:20:04       55 阅读

热门阅读

  1. 超级源点/汇点(算法篇)

    2024-07-12 09:20:04       27 阅读
  2. 【MySQL】6.表的增删查改(CURD)

    2024-07-12 09:20:04       21 阅读
  3. 开源项目的机遇与挑战

    2024-07-12 09:20:04       23 阅读
  4. 从0到1搭建数据中台(2):数据中台架构

    2024-07-12 09:20:04       22 阅读
  5. 【C/C++】内存相关

    2024-07-12 09:20:04       23 阅读
  6. 【LeetCode 0169】【摩尔投票算法】主元素

    2024-07-12 09:20:04       22 阅读
  7. 每日一道算法题 LCR 151. 彩灯装饰记录 III

    2024-07-12 09:20:04       29 阅读
  8. 【随想】社交

    2024-07-12 09:20:04       21 阅读
  9. 谷歌独立站:纯净网络空间,自由与创新的融合

    2024-07-12 09:20:04       23 阅读
  10. Centos解决服务器时间不准的问题

    2024-07-12 09:20:04       22 阅读
  11. 计算机视觉发展历史、优势以及面临的挑战

    2024-07-12 09:20:04       17 阅读
  12. 使用bsdconfig配置CBSD NAT

    2024-07-12 09:20:04       21 阅读