java数据结构与算法刷题-----LeetCode134. 加油站

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 贪心
    • 2. 动态规划

在这里插入图片描述

1. 贪心

解题思路:时间复杂度O( n n n),空间复杂度O( 1 1 1)
  1. 暴力解法,从头到尾遍历加油站,以当前加油站为起点,判断是否可以行驶一周,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  2. 贪心思想,减小被检查加油站的数量,降低时间复杂度,只需遍历一遍数组
  3. 只要所有加油站的油量加起来 > 总耗油量,那就一定有一个加油站满足条件
  4. 但是,单纯的统计油量和花费汽油量,只能知道是否有个加油站满足条件,不能知道这个加油站是哪个
  5. 因此,我们需要在统计油量和花费汽油量的过程中,顺便找这个满足条件的加油站

贪心思路

  1. 从x出发,每经过一个加油站就加一次油(起始加油站也算),最多走到回到x为止,不多走
  2. 最后肯定会到达一个加油站,这个加油站有两种可能
  1. 回到了x,那么x就是满足条件的加油站
  2. 到达一个加油站Y,就走不下去了,无法回到x。
  1. 如果是第二种可能,到了Y,就走不下去了,无法完成绕一圈的操作。那么一个事实是:从x和y之间的任何一个加油站出发,都无法到达y的下一个加油站
  2. 那么很明显,贪心的思想就是,如果到y走不下去了,下次就从y+1走,同时我们需要重新统计油量和耗油量

代码思路

  1. 从0号加油站出发,每经过一个加油站(包括0号加油站)就统计可获得的油量总和sumOfGas,以及需要花费的油量总和sumOfCost
  2. 情况一:当走到y加油站时走不下去了(sumOfGas < sumOfCost),从y+1继续,同时sumOfGas 和sumOfCost归0,重新统计
  3. 情况二:正好绕了一圈,那么我们找到了这个加油站了
  4. 因为下标涉及循环,需要类似循环链表的循环下标法:下标 % 加油站数量 = 循环后的实际加油站位置。例如5个加油站,目前下标为9,那么我们在10%9 = 4号加油站,也就是最后一个加油站(下标从0开始);

时间复杂度,最多为2*n

  1. 最坏情况是,情况一,从0号加油站走到y后,走不下去了,此时从y+1继续走,依然走不下去。直到所有加油站都访问过时
  2. 此时发现所有加油站都走过了,则没有答案。因为无法完成绕一圈的操作时,从x和y之间的任何一个加油站出发,都无法到达y的下一个加油站。另外sumOfGas < sumOfCost也证明没有答案
代码

在这里插入图片描述

class Solution {//只要所有加油站的油量加起来 > 总耗油量,那就一定有一个加油站满足条件//所以,单纯的统计油量和花费汽油量,只能知道是否有这个加油站满足条件,不能知道这个加油站是哪个//因此,我们需要在统计油量和花费汽油量的过程中,顺便找这个满足条件的加油站public int canCompleteCircuit(int[] gas, int[] cost) {int n = gas.length;int i = 0;//汽油下标while (i < n) {int sumOfGas = 0, sumOfCost = 0;//保存有多少汽油,和需要花费多少汽油。int cnt = 0;//当前车子走到哪里,注意这个是循环下标//此循环中,统计油量和花费汽油量while (cnt < n) {//cnt需要走一个循环int j = (i + cnt) % n;//获取循环下标(因为我们可以从最后一个加油站,直接回到第一个加油站)sumOfGas += gas[j];//每走到一个加油站,油量++,每个加油站只会累加一次sumOfCost += cost[j];//每离开一个加油站,油量花费++。每个花费只会累加一次if (sumOfCost > sumOfGas) {//如果花费,大于当前持有的油break;//跳出,当前i号加油站不满足条件}cnt++;//否则继续行驶}if (cnt == n) {//如果cnt == n说明正好绕了一圈return i;//那么i是一个合适的起点} else {//否则内部循环遍历过的不用再次遍历//走到这里说明已经到达的加油站,都不满足条件,直接从下一个加油站继续i = i + cnt + 1;//从cnt当前所在加油站的下一个加油站继续走}//如果此时i>=n了,说明所有加油站都不合格,返回-1,否则继续循环}return -1;//如果最终无法到达,返回-1;}
}

2. 动态规划

解题思路:时间复杂度O( n n n),空间复杂度O( 1 1 1)
  1. dp[i]=dp[i-1]+gas[i]-cost[i],求最小的dp[i],并且最后dp[n-1]必须>0,不然无解
  2. gas = [1,2,3,4,5], cost = [3,4,5,1,2]为例:dp数组为 [-2,-4,-6,-3,0]。下标i代表从0号到i号加油站。保存的值是总油量(总获取油量 - 总消耗量)
  3. 如果最后一个元素为>=0,那么说明有解。但是哪个是起点加油站呢,只要找到dp数组中的最低点(最小值)的后一个即可
  4. 因为最低点,代表左边是下降曲线(消耗量>油量),右边一定是油量大于消耗量。所以最低点的右边,是第一个油量大于消耗量的,一定是起点。但是前提是dp数组最后一个元素>=0

按照上面的想法写代码,空间复杂度为O(n), 但是我们发现,我们每次计算i号加油站的dp值,只需要前一个i-1的状态,所以全部用一个变量即可操作。从而将空间复杂度降到O(1)

代码

在这里插入图片描述

class Solution {//动态规划 O(N)//dp[i] = dp[i-1] + gas[i] - cost[i],求最小的 dp[i],并且最后 dp[n-1] 必须 > 0,不然无解//gas = [1,2,3,4,5], cost = [3,4,5,1,2]//dp数组为 [-2,-4,-6,-3,0]。下标i代表从0号到i号加油站。保存的值是总油量(总获取油量 - 总消耗量)//如果最后一个元素为 >= 0,那么说明有解//但是哪个是起点加油站呢,只要找到dp数组中的最低点(最小值)的后一个即可//因为最低点,代表左边是下降曲线(消耗量>油量),右边一定是油量大于消耗量。所以最低点的右边,是第一个油量大于消耗量的,一定是起点int canCompleteCircuit(int[] gas, int[] cost) {int n = gas.length;// 相当于图像中的坐标点和最低点int sum = 0, minSum = 0;//sum即表示dp[i-1]又表示dp[i],minSum保存最低点的值int start = 0;//start保存最低点的下标for (int i = 0; i < n; i++) {sum += gas[i] - cost[i];//到这里,sum本身是dp[i-1],然后+=gas[i] - cost[i],变成dp[i]本身if (sum < minSum) {//如果sum是新的最低点// 经过第 i 个站点后,使 sum 到达新低// 所以站点 i + 1 就是最低点(起点)start = i + 1;minSum = sum;}}if (sum < 0) {//dp[n-1],也就是dp数组最后一个元素,小于0的话,就无解// 总油量小于总的消耗,无解return -1;}// 环形数组特性//如果sum,也就是dp[n - 1]>=0,说明有解,start就是起点,但是因为我们是循环数组,如果start是n,表示起点是0return start == n ? 0 : start;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

太阳辐射传感器的工作原理

TH-FS1太阳辐射传感器是一种专门用于测量太阳辐射能量的设备&#xff0c;它可以广泛应用于太阳能利用、气象、农业、建筑材料老化以及大气污染等部门。太阳辐射传感器有多种类型&#xff0c;其中太阳总辐射传感器和热电式太阳总辐射传感器是较为常见的两种。 太阳总辐射传感器主…

华为云HECS+NODEJS开启WEB服务后无法外网访问

接上篇&#xff1a;使用华为云HECS服务器nodejs开启web服务-CSDN博客 目录 1.首先确认安全组是开放了端口的。 2.然后开启端口 1.首先确认安全组是开放了端口的。 这里我是用的3000端口 然后需要检查一下服务器防火墙是否开启了这个端口。 输入命令检查一下3000端口是否开…

基于Django兴趣班预约管理系统

技术&#xff1a;pythonmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大…

每日汇评:黄金等待金叉确认和央行裁决

金价周二早盘徘徊在每盎司2160美元附近&#xff0c;等待主要央行的决定&#xff1b; 尽管美债收益率疲软&#xff0c;但在日本央行和澳央行做出谨慎裁决之前&#xff0c;美元依然坚挺&#xff1b; 随着RSI指数再次转为看涨&#xff0c;黄金价格在日线图上试探金叉形态&#xff…

算法沉淀——贪心算法二(leetcode真题剖析)

算法沉淀——贪心算法二 01.最长递增子序列02.递增的三元子序列03.最长连续递增序列04.买卖股票的最佳时机 01.最长递增子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-increasing-subsequence/ 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子…

空间解析几何之直线与平面:推导直线与直线、直线与平面交点

空间解析几何——直线与平面 三维空间中的直线和平面与二维空间中的性质有一定的类似之处&#xff0c;但是其相交关系的求解方式有所差异。本文回顾了三维空间中直线和平面的解析表达&#xff0c;然后推导线-线、线-面交点。 平面 空间平面的表达式为&#xff1a; A x B y…

NCV33172DR2G运算放大器芯片中文资料规格书PDF数据手册引脚图产品概述功能

产品概述&#xff1a; MC33071/72/74 系列单片运算放大器采用了带有创新设计概念的优质双极制造。此类器件根据放大器在 180 A 下运行&#xff0c;提供 1.8 MHz 增益带宽积和 2.1 V/s 摆率&#xff0c;而不采用 JFET 器件技术。尽管此系列可基于分割电源运行&#xff0c;但它尤…

Linux服务器部署若依(ruoyi-vue),从购买服务器到部署完成保姆级教程

零、购买服务器 Huawei Cloud EulerOS 还是 centos7&#xff0c;纠结了一段时间&#xff0c;了解到EulerOS是对centos8的延续版本&#xff0c;相当于官方不对centos8继续维护了&#xff0c; 最后还是选 CentOS 7.9 64bit&#xff0c;网上可查找的工具更多且官方还在持续维护。…

PHP反序列化--_wakeup()绕过

一、漏洞原理&#xff1a; 二、靶场复现: 进入靶场&#xff0c;分析源代码&#xff1a; <?php error_reporting(0); class secret{var $fileindex.php;public function __construct($file){$this->file$file;}function __destruct(){include_once($this->file);ech…

算法沉淀——贪心算法三(leetcode真题剖析)

算法沉淀——贪心算法三 01.买卖股票的最佳时机 II02.K 次取反后最大化的数组和03.按身高排序04.优势洗牌 01.买卖股票的最佳时机 II 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 给你一个整数数组 prices &#xff0c;其中 pric…

算法第三十天-矩阵中移动的最大次数

矩阵中移动的最大次数 题目要求 解题思路 网格图 DFS 从第一列的任一单元格 ( i , 0 ) (i,0) (i,0) 开始递归。枚举往右上/右/右下三个方向走&#xff0c;如果走一步后&#xff0c;没有出界&#xff0c;且格子值大于 g r i d [ i ] [ j ] grid[i][j] grid[i][j]&#xff0c;则…

未来十年 人工智能的发展前景是什么?

所谓AIGC就是用人工智能来进行内容生产,它的特点就是有非常强大的内容生产力,可以大幅提升内容生产的质量和效率,未来也会极大地丰富大家的数字生活。 是不是感觉现在说数字生活还是很虚,但仔细想想一切都是有迹可循——从Stable Diffusion ChatGPT,再到Midjour-ney V5和…

面向未来的电子元器件批发商城:智能化服务与用户体验革新

面向未来的电子元器件批发商城必须不断地进行智能化服务与用户体验的革新&#xff0c;以适应快速发展的科技趋势和不断变化的市场需求。以下是一些关键的方向和策略&#xff1a; 智能化供应链管理&#xff1a; 引入先进的人工智能和大数据分析技术&#xff0c;实现供应链的智能…

Springboot-软件授权License

无意中看到了一个简单方便的授权方式&#xff0c;只需几步就可集成到boot项目中。 先上地址&#xff1a;smart-license: 保护个人与企业的软件作品权益&#xff0c;降低盗版造成的损失。PS&#xff1a;因个人精力有限&#xff0c;不再提供该项目的咨询答疑服务。 Smart-licen…

Java代码审计安全篇-反序列化漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

计算机基础入门2:GPU

GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;又被称作显示核心、视觉处理器、显示芯片&#xff0c;是一种专为并行处理而设计的微型处理器&#xff0c;非常擅长处理大量简单任务&#xff0c;包括图形和视频渲染。 GPU根据接入系统方式分为集成…

深度学习_卷积

卷积 卷积&#xff08;Convolution&#xff09;是数学和计算机科学中的一个重要概念&#xff0c;特别在信号处理和图像处理中应用广泛。在信号处理领域&#xff0c;卷积是两个函数之间的一种数学操作&#xff0c;它表示两个函数的重叠部分的积分量。 在图像处理中&#xff0c…

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

打造精益标杆生产线:从理念到实践的全面升级!

在制造业竞争日益激烈的今天&#xff0c;精益生产已成为企业提升效率、降低成本、增强竞争力的重要手段。那么&#xff0c;如何打造一条精益标杆生产线呢&#xff1f;本文&#xff0c;天行健精益制造咨询公司将从理念导入、流程优化、员工培训、持续改进等方面&#xff0c;为大…

MybatisPlus逆向工程

目录 &#x1f9c2;1.前提说明 &#x1f37f;2.引入依赖 &#x1f32d;3.使用导入模板 1.前提说明 注意 适用版本&#xff1a;mybatis-plus-generator 3.5.1 以下版本&#xff0c;3.5.1 及以上的请参考 3.5.1以上参考官网&#xff1a;3.5.1以上逆向工程 2.引入依赖 …