刻意练习:LeetCode实战 — Task29. 加油站

背景

本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。

本次任务的知识点:贪心算法

贪心算法(greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。

贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。


题目

  • 题 :134
  • 难度:中等
  • https://leetcode-cn.com/problems/gas-station/

在一条环路上有个加油站,其中第个加油站有汽油升。

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

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

说明:

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

示例 1:

示例 2:


实现

第一种:模拟仿真

首先:只有第站的(加入汽油数 >= 消耗汽油数),才能作为起始加油站。此时剩余油数为。

其次:第站的剩余油数为只有才能前往下一站,否则不能前往下一站。

以此类推,若能跑完一周,则找到起始的加油站。

  • 执行结果:通过
  • 执行用时:236 ms, 在所有 C# 提交中击败了 20.75% 的用户
  • 内存消耗:24.7 MB, 在所有 C# 提交中击败了 14.29% 的用户

第二种:连续求和法

易知当总加入汽油数大于等于总消耗油汽油数时,无论如何都有解,关键就在于找出起点。

又因为有解时答案唯一,故可将问题转化为求连续和法,若连续和小于等于0,那么此段中肯定不含可以作起点的油站,将下一个油站记为起点继续计算。

  • 执行结果:通过
  • 执行用时:116 ms, 在所有 C# 提交中击败了 60.38% 的用户
  • 内存消耗:24.7 MB, 在所有 C# 提交中击败了 14.29% 的用户

python 语言

  • 执行结果:通过
  • 执行用时:40 ms, 在所有 Python3 提交中击败了 90.29% 的用户
  • 内存消耗:14.3 MB, 在所有 Python3 提交中击败了 5.52% 的用户

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗li>
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学 会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
,请扫描二维码:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年2月26日
下一篇 2020年2月26日

相关推荐