面试经典题目:LeetCode134_加油站

news/2024/12/28 13:59:53/

leetcode134_加油站

在这里插入图片描述

题目链接:leetcode134_加油站

暴力解法

暴力解法会尝试每个加油站作为起点,模拟一圈行驶来验证是否能成功环绕一周。这种方法的时间复杂度是 O(n^2)(超时),因为它对每个可能的起点都进行了完整的模拟。以下是暴力解法的简化描述:

  1. 遍历所有加油站:将每一个加油站作为潜在的起点。
  2. 模拟行驶:从当前选择的起点开始,检查是否有足够的油量到达下一个加油站,并继续此过程直到回到起点。
  3. 返回结果:如果找到一个成功的起点,则返回该索引;如果所有起点都无法完成一圈,则返回 -1

暴力解法的问题在于它没有利用已经获得的信息,每次都要重新计算,导致了不必要的重复工作。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int len = gas.size();for (int index = 0; index < len; index++){int i = index, sum = gas[i],end=0;bool flag = false;while (sum >= cost[i]){sum = sum - cost[i] + gas[(i + 1) % len];end=i+1;i = end % len;if ((end == len && index == 0) || i == 0)flag = true;if (flag && i == index)return index;}}return -1;}
};

贪心算法

初始条件

x x x y y y 是两个加油站,且 x < y x < y x<y

  • g a s [ i ] gas[i] gas[i] 表示第 i i i 个加油站的油量。
  • c o s t [ i ] cost[i] cost[i] 表示从第 i i i 个加油站到下一个加油站所需的油量。

第一个不等式

∑ i = x y g a s [ i ] < ∑ i = x y c o s t [ i ] \sum_{i=x}^{y} gas[i] < \sum_{i=x}^{y} cost[i] i=xygas[i]<i=xycost[i]

这个不等式表明从加油站 $ x $ 到加油站 $ y $ 的总油量不足以覆盖这段路程所需的总油量,因此无法直接从 $ x $ 到达 $ y $。

第二个不等式

∑ i = x j g a s [ i ] ≥ ∑ i = x j c o s t [ i ] (对于所有  j ∈ [ x , y ) ) \sum_{i=x}^{j} gas[i] \geq \sum_{i=x}^{j} cost[i] \quad \text{(对于所有 } j \in [x, y)) i=xjgas[i]i=xjcost[i](对于所有 j[x,y))

这个不等式表明对于所有位于 $ x $ 和 $ y $ 之间的加油站 $ j $,从 $ x $ 到 $ j $ 的总油量足以覆盖这段路程所需的总油量,因此可以到达这些加油站。

考虑任意加油站 z z z

现在考虑任意一个位于 x x x y y y 之间的加油站 z z z,我们需要判断从 z z z 出发是否能到达 y y y

推导过程

  1. 分解和

    ∑ i = z y g a s [ i ] = ∑ i = x y g a s [ i ] − ∑ i = x z − 1 g a s [ i ] \sum_{i=z}^{y} gas[i] = \sum_{i=x}^{y} gas[i] - \sum_{i=x}^{z-1} gas[i] i=zygas[i]=i=xygas[i]i=xz1gas[i]

  2. 应用第一个不等式

    ∑ i = x y g a s [ i ] < ∑ i = x y c o s t [ i ] \sum_{i=x}^{y} gas[i] < \sum_{i=x}^{y} cost[i] i=xygas[i]<i=xycost[i]

    因此,

    ∑ i = x y g a s [ i ] − ∑ i = x z − 1 g a s [ i ] < ∑ i = x y c o s t [ i ] − ∑ i = x z − 1 g a s [ i ] \sum_{i=x}^{y} gas[i] - \sum_{i=x}^{z-1} gas[i] < \sum_{i=x}^{y} cost[i] - \sum_{i=x}^{z-1} gas[i] i=xygas[i]i=xz1gas[i]<i=xycost[i]i=xz1gas[i]

  3. 应用第二个不等式

    ∑ i = x z − 1 g a s [ i ] ≥ ∑ i = x z − 1 c o s t [ i ] \sum_{i=x}^{z-1} gas[i] \geq \sum_{i=x}^{z-1} cost[i] i=xz1gas[i]i=xz1cost[i]

    因此,

    ∑ i = x y c o s t [ i ] − ∑ i = x z − 1 g a s [ i ] < ∑ i = x y c o s t [ i ] − ∑ i = x z − 1 c o s t [ i ] \sum_{i=x}^{y} cost[i] - \sum_{i=x}^{z-1} gas[i] < \sum_{i=x}^{y} cost[i] - \sum_{i=x}^{z-1} cost[i] i=xycost[i]i=xz1gas[i]<i=xycost[i]i=xz1cost[i]

  4. 简化表达式

    ∑ i = x y c o s t [ i ] − ∑ i = x z − 1 c o s t [ i ] = ∑ i = z y c o s t [ i ] \sum_{i=x}^{y} cost[i] - \sum_{i=x}^{z-1} cost[i] = \sum_{i=z}^{y} cost[i] i=xycost[i]i=xz1cost[i]=i=zycost[i]

  5. 最终结论

    ∑ i = z y g a s [ i ] < ∑ i = z y c o s t [ i ] \sum_{i=z}^{y} gas[i] < \sum_{i=z}^{y} cost[i] i=zygas[i]<i=zycost[i]

结论

从任意一个位于 x x x y y y 之间的加油站 z z z 出发,都无法到达加油站 y y y,因为从 z z z y y y 的总油量不足以覆盖这段路程所需的总油量。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int totalTank = 0, currentTank = 0;int startingStation = 0;for (int i = 0; i < gas.size(); ++i) {// 更新总油量和当前油量totalTank += gas[i] - cost[i];currentTank += gas[i] - cost[i];// 如果当前油量为负,说明从起点到当前位置不可能到达,更新起点为下一个位置if (currentTank < 0) {startingStation = i + 1;currentTank = 0; // 重置当前油量}}// 如果总油量为非负数,说明可以完成一圈;否则不能完成return totalTank >= 0 ? startingStation : -1;}
};

http://www.ppmy.cn/news/1558806.html

相关文章

微信小程序 不同角色进入不同页面、呈现不同底部导航栏

遇到这个需求之前一直使用的小程序默认底部导航栏&#xff0c;且小程序默认入口页面为pages/index/index&#xff0c;要使不同角色呈现不同底部导航栏&#xff0c;必须要在不同页面引用不同的自定义导航栏。本篇将结合分包&#xff08;subPackages&#xff09;展开以下三步叙述…

Android Studio Gradle Sync timeout

使用Android Studio开发Android应用程序时&#xff0c;Gradle sync timeout常用的处理方法有&#xff1a; 增加超时设置&#xff1a;在 gradle.properties 文件中增加超时设置&#xff0c;给 Gradle 更长时间完成同步使用国内镜像&#xff1a;通过配置阿里云、华为或腾讯云的 …

【Python运维】构建基于Python的自动化运维平台:用Flask和Celery

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT运维中,自动化运维平台扮演着至关重要的角色,它能够显著提高运维效率,减少人为错误,并且增强系统的可维护性。本文将引导读者如…

阿里云人工智能ACA(五)——深度学习基础

一、深度学习概述 1. 深度学习概念 1-1. 深度学习基本概念 深度学习是机器学习的一个分支基于人工神经网络&#xff08;模仿人脑结构&#xff09;通过多层网络自动学习特征能够处理复杂的模式识别问题 1-2. 深度学习的优点与缺点 优点 强大的特征学习能力可以处理复杂问题…

华为战略解码-162页 八大章节 精读

该文档主要解读了华为战略解码的过程和内容&#xff0c;强调了领导力在战略管理中的重要性&#xff0c;介绍了华为战略管理的七个关键点以及领导力的七个特质。文档详细阐述了华为在战略解码过程中如何利用BLM模型等工具&#xff0c;以及如何从市场洞察、业务设计等方面制定和执…

2024年OpenTiny年度人气贡献者评选正式开始

携手共创&#xff0c;致敬不凡&#xff01; 2024年&#xff0c;OpenTiny持续在前端开源领域扎根&#xff0c;每一位开发者都是推动项目共同前行的宝贵力量。从bug修复&#xff0c;到技术探讨&#xff1b;从参与开源活动&#xff0c;到输出技术文章&#xff1b;从使用项目&…

游戏引擎学习第59天

回顾并计划接下来的一天 在处理实体的空间划分时&#xff0c;遇到了一些问题。例如&#xff0c;虽然树和玩家应该在某些情况下被排除在外&#xff0c;但目前的系统仍然会出现不合逻辑的渲染结果&#xff0c;这在视觉上并不符合预期。尽管这些问题主要是渲染上的&#xff0c;并…

使用Python实现自动化文档生成工具:提升文档编写效率的利器

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…