当前位置: 首页 > news >正文

【贪心算法题记录】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;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring AOP 实现原理
  • Java学习笔记整理: 关于设计模式:单例模式 2024/7/10;
  • 一节课说明一类奥数题系列——约数与倍数
  • 综合实验作业
  • ubuntu重装系统后,安装cuda,cudnn
  • 连接与隔离:Facebook在全球化背景下的影响力
  • 帕金森是怎么回事
  • 嵌入式工程师从0开始,到底该学什么,怎么学?
  • 生产英特尔CPU处理器繁忙的一天
  • 【第二章】开发模型和测试模型
  • (自用)gtest单元测试
  • Python爬虫-数据解析(先爬取整张页面再提取局部数据)
  • 在Ubuntu下安装samba实现和Windows系统文件共享
  • 第100+15步 ChatGPT学习:R实现Ababoost分类
  • 微信小程序开发跳转京东,淘宝小程序
  • 深入了解以太坊
  • php的引用
  • 10个最佳ES6特性 ES7与ES8的特性
  • JAVA之继承和多态
  • Linux下的乱码问题
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node 版本过低
  • Puppeteer:浏览器控制器
  • React-生命周期杂记
  • 关于extract.autodesk.io的一些说明
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于游标的分页接口实现
  • ------- 计算机网络基础
  • 技术:超级实用的电脑小技巧
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何用vue打造一个移动端音乐播放器
  • 深入 Nginx 之配置篇
  • 怎样选择前端框架
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • $NOIp2018$劝退记
  • (Note)C++中的继承方式
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (六)DockerCompose安装与配置
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十)T检验-第一部分
  • (万字长文)Spring的核心知识尽揽其中
  • (五)Python 垃圾回收机制
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)linux 命令大全
  • (转)程序员技术练级攻略
  • (转)拼包函数及网络封包的异常处理(含代码)