力扣第134题 加油站 c++ 暴力 + 贪心

题目

134. 加油站

中等

相关标签

贪心   数组

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

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

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -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 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

提示:

  • gas.length == n
  • cost.length == n
  • 1 <= n <= 105
  • 0 <= gas[i], cost[i] <= 104

思路和解题方法 一(暴力)

  • 目标是判断给定的汽油站能否构成一个环路,使得可以从某个站点出发,顺时针往前绕一圈返回该站点。每个站点有两个属性:gas[i] 表示在该站点加油可获得的油量,cost[i] 表示从该站点到下一个站点需要消耗的油量。
  • 为了判断是否可以行驶一圈,我们可以模拟一遍整个过程。假设从第 i 个站点出发,开始时剩余油量为 gas[i]−cost[i],依次到达第 i+1,i+2,...,n−1,0,1,...,i−1 个站点,每经过一个站点,就用消耗的油量减去加入的油量,同时记录当前的剩余油量。如果最后回到了起点且剩余油量不小于 0,则说明可以完成一次环形行驶。

复杂度

        时间复杂度:

                O(n*n)

时间复杂度: O(n*n),n 是站点数,因为每个站点都可能做一次循环检查。

        空间复杂度

                O(1)

空间复杂度: O(1),只需要常数个变量记录当前状态即可。

c++ 代码 一 (暴力)

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {for (int i = 0; i < cost.size(); i++) {   // 对于每一个点,以它为起点做一次循环检查int rest = gas[i] - cost[i];          // 记录当前点的剩余油量int index = (i + 1) % cost.size();    // 初始化index指向下一个点while (rest > 0 && index != i) {      // 如果还有油且没有回到起点,就继续往前走rest += gas[index] - cost[index]; // 更新剩余油量index = (index + 1) % cost.size();// 更新下一个点}if (rest >= 0 && index == i) {        // 如果油足够到达终点并回到起点了,就返回起点return i;}}return -1;                                // 否则返回-1}
};

 思路和解题方法 二(贪心)

  •         当我们遍历每个站点时,我们首先更新curSum和totalSum。curSum是从起始位置到当前位置的累加剩余油量,它等于上一个位置的curSum加上当前站点的剩余油量(gas[i] - cost[i])。totalSum是所有站点的累加剩余油量,它等于上一个位置的totalSum加上当前站点的剩余油量(gas[i] - cost[i])。
  •         接下来,我们判断curSum是否小于0,如果小于0,说明从起始位置到达当前位置的路径不可行。因为如果从起始位置开始,累加剩余油量一直小于0,那么无论从哪个位置出发都无法完成一次环形行驶。所以,我们将起始位置更新为当前位置的下一个位置(i + 1),并且重置curSum为0,相当于重新开始计算累加剩余油量。
  •         最后,我们在遍历结束后检查totalSum是否小于0。如果totalSum小于0,说明所有站点的累加剩余油量都是负数,即无法完成一次环形行驶,返回-1。否则,我们返回起始位置start,因为凡是能够完成一次环形行驶的情况下,start位置一定是符合条件的。

复杂度

        时间复杂度:

                O(n)

时间复杂度: O(n),其中n是站点数。遍历一次所有站点进行累计操作。

        空间复杂度

                O(1)

空间复杂度: O(1),只需要常数个变量记录当前状态。

c++ 代码 二 (贪心)

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) {   // 当前累加剩余油量小于0,说明从起始位置到达当前位置的路径不可行start = i + 1;  // 更新起始位置为当前位置的下一个位置curSum = 0;     // 重置当前累加剩余油量为0}}if (totalSum < 0) return -1;   // 总累加剩余油量小于0,说明无法完成一次环形行驶,返回-1return start;                  // 返回起始位置}
};

对于这里的解释

            curSum += gas[i] - cost[i];    // 更新当前累加剩余油量totalSum += gas[i] - cost[i];  // 更新总累加剩余油量if (curSum < 0) {   // 当前累加剩余油量小于0,说明从起始位置到达当前位置的路径不可行start = i + 1;  // 更新起始位置为当前位置的下一个位置curSum = 0;     // 重置当前累加剩余油量为0}
  1. 更新当前累加剩余油量(curSum): curSum从上一个站点累加的剩余油量加上当前站点的剩余油量(gas[i] - cost[i])得到。

  2. 更新总累加剩余油量(totalSum): totalSum从上一个站点累加的剩余油量加上当前站点的剩余油量(gas[i] - cost[i])得到。

        curSum的作用是判断从起始位置到达当前位置的路径是否可行。如果curSum小于0,说明从起始位置到达当前位置的路径不可行,因为从起始位置开始到当前位置油量一直不足,不可能顺利到达当前位置,更别说从当前位置继续走了。所以我们需要将起始位置更新为当前位置的下一个位置(i+1),并将curSum重置为0,相当于重新开始计算从新的起始位置到哪个位置的路径可行。

        totalSum的作用是判断整个环路是否可行。如果totalSum小于0,说明所有站点的总剩余油量是负数,即无法完成一次环形行驶,返回-1即可。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/117485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybit-Plus

1.MyBatis-Plus的代码生成器快速生成后端代码 实体类 持久层代码 注意&#xff1a;mapper接口都继承于BaseMapper 服务层代码 注意&#xff1a;service接口都继承于IService&#xff0c;service实现类都继承ServiceImpl 控制层代码 注意&#xff1a;只有类&a…

SpringAOP源码解析之advice构建排序(二)

上一章我们知道Spring开启AOP之后会注册AnnotationAwareAspectJAutoProxyCreator类的定义信息&#xff0c;所以在属性注入之后initializeBean的applyBeanPostProcessorsAfterInitialization方法执行的时候调用AnnotationAwareAspectJAutoProxyCreator父类(AbstractAutoProxyCre…

CDC实时数据同步

一丶CDC实时数据同步介绍 CDC实时数据同步指的是Change Data Capture&#xff08;数据变更捕获&#xff09;技术在数据同步过程中的应用。CDC技术允许在数据源发生变化时&#xff0c;实时地捕获这些变化&#xff0c;并将其应用到目标系统中&#xff0c;从而保持数据的同步性。…

Spring Security漏洞防护—HTTP 安全响应头

一、默认的 Security Header Spring Security提供了 一套默认的安全HTTP响应头&#xff0c;以提供安全默认值。虽然这些头信息中的每一个都被认为是最佳实践&#xff0c;但应该注意的是&#xff0c;并不是所有的客户端都使用这些头信息&#xff0c;所以鼓励进行额外的测试。 …

电脑软件:推荐一款非常强大的pdf阅读编辑软件

目录 一、软件简介 二、功能介绍 1、界面美观&#xff0c;打开速度快 2、可直接编辑pdf 3、非常强大好用的注释功能 4、很好用的页面组织和提取功能 5、PDF转word效果非常棒 6、强大的OCR功能 三、软件特色 四、软件下载 pdf是日常办公非常常见的文档格式&#xff0c;…

手写 Promise(2)实例方法与静态方法的实现

一&#xff1a;什么是 Promise Promise 是异步编程的一种解决方案&#xff0c;其实是一个构造函数&#xff0c;自己身上有all、reject、resolve这几个方法&#xff0c;原型上有then、catch等方法。 Promise对象有以下两个特点。 &#xff08;1&#xff09;对象的状态不受…

SOCKS5代理与网络安全:如何安全地进行爬虫操作

随着网络技术的不断发展&#xff0c;代理技术在网络安全和数据爬取中扮演着越来越重要的角色。本文将重点介绍SOCKS5代理、SK5代理和IP代理的基本概念&#xff0c;以及如何在保证网络安全的前提下&#xff0c;利用这些技术进行有效的爬虫操作。 1. SOCKS5代理与SK5代理 SOCKS…

大学兼职教师管理系统 用JAVA语言开发

一、项目介绍 基于VueSpringBootMySQL的大学兼职教师管理系统包含学生管理、教师管理、课程档案管理、课程评价管理、课程考勤管理、授课管理、课程成绩管理教龄/薪资分析可视化图表&#xff0c;还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管…

【pdf密码】为什么我的PDF文件不能复制文字?

大家现在接触PDF文件越来越多&#xff0c;有的时候在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很…

【Bash】记录一个长命令换行的BUG

假设现在我要在terminal执行如下命令跑模型&#xff1a; CUDA_VISIBLE_DEVICES6 python finetune.py -c configs/quantized/resnet32_cifar100_finetune.yml --model resnet32 --data-dir ~/datasets --apex-amp --initial-checkpoint /home/zwx/projects/hawq/resnet32.pth.t…

HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

一、HTTP介绍二、HTTP工作原理HTTP三点注意事项 三、HTTP消息结构四、客户端请求消息五、服务器响应消息HTTP请求方法 七、HTTP响应头信息八、HTTP状态码&#xff08;HTTP Status Code&#xff09;下面是常见的HTTP状态码&#xff1a;HTTP状态码分类HTTP状态码列表 一、HTTP介绍…

golang 工程组件:grpc-gateway option自定义http规则

option自定义http规则和http body响应 简介 本篇接上文 golang 工程组件&#xff1a;grpc-gateway 环境安装默认网关测试 默认网关配置终究是难用&#xff0c;本篇介绍一下proto里采用option自定义http规则以及让网关返回http响应而不是我们定义的grpc响应 option定义http…

LVS+keepalived高可用负载均衡集群

keepalived介绍 keepalived为LVS应运而生的高可用服务。LVS的调度器无法做高可用&#xff0c;于是keepalived这个软件。实现的是调度器的高可用。 但是keepalived不是专门为LVS集群服务的&#xff0c;也可以做其他代理服务器的高可用。 LVS高可用集群的组成 主调度器备调度器&…

C语言程序设计——题目:用*号输出字母C的图案。程序分析:可先用‘*‘号在纸上写出字母C,再分行输出。

题目&#xff1a;用*号输出字母C的图案。 程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 #include<stdio.h> int main() {printf(" *****\n");printf(" *\n");printf("*\n");printf("*\n");printf(&…

Ubuntu deadsnakes 源安装新版 python

前言 适用于 Ubuntu 安装 python3.11 等新版本。 因为比较常用并且不想重新编译就记录一下&#xff0c;方便以后面向CV安装。 安装 添加 deadsnakes ppa 源 sudo add-apt-repository ppa:deadsnakes/ppa更新 apt sudo apt update安装 python3.11 sudo apt install python…

监控与升级

文章目录 主要内容一.部署Metrics1.部署代码如下&#xff08;示例&#xff09;: 2.解释 二.升级控制平面1.先确定要升级的版本代码如下&#xff08;示例&#xff09;: 2.禁止master节点接受新调度代码如下&#xff08;示例&#xff09;: 3.驱逐master节点上的现有任务代码如下&…

PhpStorm快速注释与取消注释

ctrl / 单行注释 ctrl shift / 多行注释 重复以上操作&#xff0c;取消注释。

【计算机网络】HTTPS 的加密流程

HTTPS (Hypertext Transfer Protocol Secure) 是一种安全的 HTTP 协议&#xff0c;采用了加密通信技术&#xff0c;可以保护客户端与服务器之间的数据传输安全&#xff0c;从而防止中间人攻击、窃听、篡改等恶意操纵。HTTPS 的加密流程包括以下几个步骤&#xff1a; 客户端发送…

5G投资下降,遥遥领先的主流5G或被运营商抛弃,“假5G”更获青睐

虽然媒体仍然在宣扬5G的诸多领先技术优势&#xff0c;不过需要付钱的运营商已在行动中做出抉择&#xff0c;那就是放缓主流5G的投资&#xff0c;大举投资曾被称为“假5G”的低频5G&#xff0c;现实迫使运营商做出了如此选择。 媒体披露的数据指2022年中国的5G投资下滑了2.5%&am…

vue自定义全局指令v-emoji限制input输入表情和特殊字符

问题&#xff1a; 后台不提供富文本存储&#xff0c;所以emoji表情入库会报错需求要求前端在输入的时候过滤掉表情符号全局的input 和富文本textarea输入框都需要过滤emoji表情 分析&#xff1a; 1.每一个input写事件写正则校验代码量实在太多了还很麻烦&#xff1b;所以想用…