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 贪心相关推荐

  1. LeetCode力扣刷题——简单易懂的贪心算法

    贪心 一.算法解释 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的. 贪心算法问题需要满足的条件: (1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较 ...

  2. 力扣刷题pdf(java版本,内含暗黑版和光明版),都在这里了

    BAT大佬力扣刷题pdf,都在这里了! ​相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手! 我找了很久,今天终于让找到了Java版leetcode算法题解笔记,强烈建议先按照本篇介绍pd ...

  3. 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!

    开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...

  4. 《剑指Offer》力扣刷题笔记(03-10)

    <剑指Offer>力扣刷题笔记(03-10) 最近确实有点闲,想在进组搬砖之前找点有意义的事干,于是,就开始刷<剑指Offer>.<程序员面试金典>等书上的题目,也 ...

  5. 力扣刷题之二叉树的层序遍历

                                                      Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 ...

  6. 『力扣刷题』5275_找出井字棋的获胜者 解题代码

    LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5275_找出井字棋的获胜者 * 5275. 找出井字棋的获胜者 显示英文描述* 用户通过次数0* 用户尝试次数0* ...

  7. 『力扣刷题』5276_不浪费原料的汉堡制作方案 解题代码

    LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5276_不浪费原料的汉堡制作方案 * 5276. 不浪费原料的汉堡制作方案 显示英文描述* 用户通过次数212* 用 ...

  8. 『力扣刷题』5238_找出给定方程的正整数解 解题代码

    html: embed_local_images: true embed_svg: true offline: true toc: undefined print_background: false ...

  9. 力扣刷题全局变量WA,局部变量AC的问题

    力扣刷题全局变量WA,局部变量AC问题 题目 原因 题目 golang力扣leetcode 1219.黄金矿工 原因 今天在刷题的时候,遇到一个现象,本地跑测试全部通过,一提交就错错错,非常离谱 然后 ...

  10. 力扣刷题-前k个高频元素

    力扣刷题-前k个高频元素 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2 ...

最新文章

  1. 分布式服务Dubbo+Zookeeper安全认证
  2. ffmpeg avformat_open_input always returns “Protocol not found”
  3. VTK:定向圆柱体用法实战
  4. 【Python】自定义排序函数 - 示例
  5. codeigniter mysql error_CodeIgniter:无法使用提供的设置错误消息连接到数据库服务器...
  6. 糖豆人维修服务器多长时间,服务器不稳定的《糖豆人》凭啥还这么火?只因做到了这三点...
  7. php函数方法,基于PHP函数的操作方法
  8. AI算法连载01:数学基础之线性代数
  9. 腾讯首届“科学探索奖”获奖名单揭晓,每人将获300万奖金
  10. 在python中使用什么函数进行输出_Python中使用pprint函数进行格式化输出的教程
  11. 线性表的链式存储-单链表
  12. 用Neo4j图形数据库打造专属于你的高bigger关系图
  13. Aster及其它遥感数据下载地址
  14. shell中色彩处理和awk使用技巧
  15. Particle Filtering粒子滤波
  16. 求求你用数学炒股行不行?
  17. 计算机word保存如何操作,如何保存WORD文档内容???急
  18. 国内首笔!蚂蚁金服完成全流程零人工干预 AI 保险理赔
  19. MA8601 无需更改电路直接pin√pin替代FE8.1s方案
  20. while 循环语法结构

热门文章

  1. feet在c语言中是什么意思,英语中说“cold feet”居然是这个意思...
  2. 【论文浅读】《Deep Pyramidal Residual Networks for Spectral–Spatial Hyperspectral Image Classification》
  3. 安装VS2008的时候Windows Mobile 5.0 SDK R2 for pocket pc错误解决方案
  4. oracle rman delete backupset,RMAN Crosscheck后delete obsolete遇到RMAN-06091的解决
  5. python dataframe是什么_【Python-pandas】核心数据结构DataFrame介绍
  6. 私藏版64页DevOps笔记免费分享
  7. PMP项目管理如何通过改革处理掉核心技术成果的潜在流失风险?
  8. 深度神经网络识别垃圾邮件
  9. MFC之菜单栏的相关使用14
  10. 用js超简单判断图片地址是否存在(404问题)