134. 加油站(前缀和+单调队列|贪心)「建议收藏」

134. 加油站(前缀和+单调队列|贪心)「建议收藏」在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例 1:输入: gas = [1,2,3,4,5]cost = [3,4,5,1,2]输

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。

说明:

如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。

示例 1:

输入: 
gas  = [1,2,3,4,5]
cost = [3,4,5,1,2]

输出: 3

解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。
示例 2:

输入: 
gas  = [2,3,4]
cost = [3,4,3]

输出: -1

解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

题解
前缀和+单调队列

class Solution { 
   
public:
    static const int N = 1e4;
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { 
   
        vector<int>t,sum;
        sum.push_back(0);
        int n = gas.size();
        for(int i = 0;i < n;i ++){ 
   
            t.push_back(gas[i] - cost[i]),
            sum.push_back(sum[i] + t[i]);
        }
        for(int i = 0;i < n - 1;i ++){ 
   
            sum.push_back(sum[n + i] + t[i]);
        }
        for(int i = 1;i < sum.size();i ++)cout<<sum[i]<<" ";
        int q[N],hh = 0,tt = 0;
        for(int i = 1;i < sum.size();i ++){ 
   
            if(hh < tt && i - q[hh] > n )hh ++;
            while(hh < tt && sum[q[tt - 1]] >= sum[i])tt --;
            q[tt ++] = i;
            if(i >= n && sum[q[hh]] >= sum[i - n])return i - n;
        }
        return -1;
    }
};
  1. 贪心:我们首先检查第 00 个加油站,并试图判断能否环绕一周;如果不能,就从第一个无法到达的加油站开始继续检查。
class Solution { 
   
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { 
   
        vector<int>t;
        for(int i = 0;i < gas.size();i ++){ 
   
            t.push_back(gas[i] - cost[i]);
        }
        int now = 0;
        for(int i = 0;i < gas.size() - 1;i ++){ 
   
            t.push_back(gas[i] - cost[i]);
        }
        int num = 0;
        int i = 0;
        int n = gas.size();
        while(num != n && i < t.size()){ 
   
            if(now + t[i] >= 0)num ++,now += t[i];
            else now = 0,num = 0;
            i ++;
        }
        if(num == n)return i - n;
        return -1;
    }
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168652.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Idea2025.1.1.1激活码教程永久有效,激活码2025.1.1.1版本绝对有效

    Idea2025.1.1.1激活码教程永久有效,激活码2025.1.1.1版本绝对有效Idea 激活码教程永久有效 2025 1 1 1 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2025 1 1 1 成功激活

    2025年5月21日
    5
  • docker下载安装教程_安卓安装docker

    docker下载安装教程_安卓安装docker前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

    2022年7月30日
    11
  • 怎么安装纯净版win10_影视大全纯净版app下载

    怎么安装纯净版win10_影视大全纯净版app下载文章目录1.制作系统安装盘1.1准备U盘以及一台用来制作安装盘的电脑1.2下载WIN10安装包1.3制作完成的系统安装盘1.4U盘格式化应选择的文件系统2.安装WIN10操作系统前的准备2.1插入系统安装盘2.2设置U盘(系统安装盘)为第一启动项2.3注意:启动引导方式的选择2.4补充:磁盘分区格式(MBR分区和GPT分区)和启动引导(Legacy和UEFI)的关系3.开始安装WIN10操作系统3.1将系统直接安装到固态硬盘内(不分区)3.2将固态硬盘分区后,将系统安装到其中一个

    2022年8月11日
    6
  • ipv6双向网关_IPv4_IPv6转换网关·····[通俗易懂]

    IPV4/IPV6转换网关的研究与设计摘要:随着计算机网络应用的飞速进步,现有的IP通信协议(IPv4协议)已展现出众多的问题,如不能适应新的网络应用、地址资源即将耗尽以及对安全性无法保证等。IPv6是继IPv4后出现的新一代通信协议,它的出现为互联网的发展带来了新契机。IPv6的众多优势成为取代IPv4必然的发展。本文从IPv6协议本身出发,阐述了IPv6协议及其与IPv4协议的比较,对目前现有…

    2022年4月9日
    60
  • delphi 字符串函数_C语言字符串函数

    delphi 字符串函数_C语言字符串函数QueueUserWorkItem函数Windows说明如下:一、异步调用函数:BOOLQueueUserWorkItem(PTHREAD_START_ROUTINEpfnCallback,PVOIDpvContext,ULONGdwFlags);该函数将“工作项目”放入线程池并且立即返回。工作项目是指一个用pfnCallback参数标识的函数。它被调用并且传递…

    2022年9月16日
    0
  • 三极管饱和及深度饱和状态的理解和判断!

    三极管饱和及深度饱和状态的理解和判断!三极管饱和问题总结:1.在实际工作中,常用Ib*β=V/R作为判断临界饱和的条件。根据Ib*β=V/R算出的Ib值,只是使晶体管进入了初始饱和状态,实际上应该取该值的数倍以上,才能达到真正的饱和;倍数越大,饱和程度就越深。2.集电极电阻越大越容易饱和;3.饱和区的现象就是:二个PN结均正偏,IC不受IB之控制问题:基极电流达到多少时三极管饱和?解答:这个值应该是不固定的,它和

    2022年9月11日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号