力扣刷题 DAY_82 贪心
Leetcode134
链接:力扣 。
题目:
在一条环路上有 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 升汽油。因此,无论怎样,你都不可能绕环路行驶一周。
思路:
暴力的方法很明显就是$O(n^2)$的,遍历每一个加油站为起点的情况,模拟一圈。如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。用for循环遍历模拟起点选择,而while循环适合模拟环形行驶。
需要注意的是,Leetcode上本题不能用暴力思路解,因为最终会超时!
我们有更优秀的贪心思路。
首先我们可以发现一件事情。如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明各个站点的加油站剩油量rest[i]相加一定是大于等于零的。每个加油站的剩余量rest[i]为gas[i] - cost[i]。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。
那么为什么一旦[i,j] 区间和为负数,起始位置就可以是j+1呢,j+1后面就不会出现更大的负数?如果出现更大的负数,就是更新j,那么起始位置又变成新的j+1了。而且j之前出现了多少负数,j后面就会出现多少正数,因为耗油总和是大于零的(前提我们已经确定了一定可以跑完全程)。
局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。全局最优:找到可以跑一圈的起始位置。
参考代码(暴力):
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {for (int index = 0; index < gas.size(); index++) {int i = index, rest = 0;bool flag = false;while (gas[i] + rest >= cost[i]) {if (i == index - 1 && flag == true) {return index;}rest = rest - cost[i] + gas[i];i = (i + 1) % gas.size();flag = true;}}return -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;}
};
力扣刷题 DAY_82 贪心相关推荐
- LeetCode力扣刷题——简单易懂的贪心算法
贪心 一.算法解释 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的. 贪心算法问题需要满足的条件: (1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较 ...
- 力扣刷题pdf(java版本,内含暗黑版和光明版),都在这里了
BAT大佬力扣刷题pdf,都在这里了! 相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手! 我找了很久,今天终于让找到了Java版leetcode算法题解笔记,强烈建议先按照本篇介绍pd ...
- 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!
开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...
- 《剑指Offer》力扣刷题笔记(03-10)
<剑指Offer>力扣刷题笔记(03-10) 最近确实有点闲,想在进组搬砖之前找点有意义的事干,于是,就开始刷<剑指Offer>.<程序员面试金典>等书上的题目,也 ...
- 力扣刷题之二叉树的层序遍历
Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 ...
- 『力扣刷题』5275_找出井字棋的获胜者 解题代码
LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5275_找出井字棋的获胜者 * 5275. 找出井字棋的获胜者 显示英文描述* 用户通过次数0* 用户尝试次数0* ...
- 『力扣刷题』5276_不浪费原料的汉堡制作方案 解题代码
LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5276_不浪费原料的汉堡制作方案 * 5276. 不浪费原料的汉堡制作方案 显示英文描述* 用户通过次数212* 用 ...
- 『力扣刷题』5238_找出给定方程的正整数解 解题代码
html: embed_local_images: true embed_svg: true offline: true toc: undefined print_background: false ...
- 力扣刷题全局变量WA,局部变量AC的问题
力扣刷题全局变量WA,局部变量AC问题 题目 原因 题目 golang力扣leetcode 1219.黄金矿工 原因 今天在刷题的时候,遇到一个现象,本地跑测试全部通过,一提交就错错错,非常离谱 然后 ...
- 力扣刷题-前k个高频元素
力扣刷题-前k个高频元素 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2 ...
最新文章
- 分布式服务Dubbo+Zookeeper安全认证
- ffmpeg avformat_open_input always returns “Protocol not found”
- VTK:定向圆柱体用法实战
- 【Python】自定义排序函数 - 示例
- codeigniter mysql error_CodeIgniter:无法使用提供的设置错误消息连接到数据库服务器...
- 糖豆人维修服务器多长时间,服务器不稳定的《糖豆人》凭啥还这么火?只因做到了这三点...
- php函数方法,基于PHP函数的操作方法
- AI算法连载01:数学基础之线性代数
- 腾讯首届“科学探索奖”获奖名单揭晓,每人将获300万奖金
- 在python中使用什么函数进行输出_Python中使用pprint函数进行格式化输出的教程
- 线性表的链式存储-单链表
- 用Neo4j图形数据库打造专属于你的高bigger关系图
- Aster及其它遥感数据下载地址
- shell中色彩处理和awk使用技巧
- Particle Filtering粒子滤波
- 求求你用数学炒股行不行?
- 计算机word保存如何操作,如何保存WORD文档内容???急
- 国内首笔!蚂蚁金服完成全流程零人工干预 AI 保险理赔
- MA8601 无需更改电路直接pin√pin替代FE8.1s方案
- while 循环语法结构
热门文章
- feet在c语言中是什么意思,英语中说“cold feet”居然是这个意思...
- 【论文浅读】《Deep Pyramidal Residual Networks for Spectral–Spatial Hyperspectral Image Classification》
- 安装VS2008的时候Windows Mobile 5.0 SDK R2 for pocket pc错误解决方案
- oracle rman delete backupset,RMAN Crosscheck后delete obsolete遇到RMAN-06091的解决
- python dataframe是什么_【Python-pandas】核心数据结构DataFrame介绍
- 私藏版64页DevOps笔记免费分享
- PMP项目管理如何通过改革处理掉核心技术成果的潜在流失风险?
- 深度神经网络识别垃圾邮件
- MFC之菜单栏的相关使用14
- 用js超简单判断图片地址是否存在(404问题)