当前位置: 首页 > ops >正文

力扣网编程134题:加油站(双指针)

一. 简介

前面两篇文章使用暴力解法,或者贪心算法解决了力扣网的加油站问题,文章如下:

力扣网编程150题:加油站(暴力解法)-CSDN博客

力扣网编程150题:加油站(贪心解法)-CSDN博客

本文使用双指针解法来解决 加油站题目。

二. 力扣网编程150题:加油站(中等)

解题思路三:(双指针)

使用双指针法求解的核心思路是:通过两个指针模拟"起点" 和 "终点" 的扩展, 判断从起点能否到达终点并绕行一圈。

1. 总体判断:

如果总油量 total_gas < total_cost,则返回 -1(说明无论哪个起点出发都无法绕一圈);

2. 双指针策略:

current_tank: 表示当前累计的油量 (currtent += gas[i] + cost[i]);

使用慢指针 start 模拟起点,使用快指针 fast模拟行驶;

如果 fast行驶到某个站时 current_tank < 0,说明从 start无法到达 fast站点,则将 start直接跳转到 fast+1(current_tank<0,说明在 start和 fast之间的任何一点都不能作为起点);

3. 结果:循环结束,start 即为可绕一圈的起点。

答案在于总油量条件的保证

  • total_tank >= 0 时,只要找到一个起点 start,使得从 start 到最后一个加油站的路径可行,那么从最后一个加油站绕回 start 的路径必然也可行(因为总油量足够)
  • 因此,代码只需验证从 start 出发能否到达最后一个加油站即可,无需额外绕环。

C语言实现如下:

//双指针法(快慢指针)
//慢指针 start:模拟起点
//快指针 fast:模拟行驶路线
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {int i;int total_tank = 0;int start = 0; //尝试的起点int fast = 0;  //模拟的终点int current_tank = 0; //当前累积的油量//大体判断//如果总油量 < 总消耗,则说明无论哪个起点都无法绕一圈for(i = 0; i < gasSize; i++) {total_tank += gas[i]-cost[i];}if(total_tank < 0) {return -1;}//否则,必然存在一起出发可以绕一圈while(fast < gasSize) {current_tank += gas[fast]-cost[fast];//说明 从start无法到达 fast站点//那么在 start和 fast站之间的任何一点都不能作为起点if(current_tank < 0) {start = (fast+1) %gasSize;current_tank = 0;}fast++;}  return start;    
}

http://www.xdnf.cn/news/15128.html

相关文章:

  • C++中柔性数组的现代化替代方案:从内存布局优化到标准演进
  • Debian:从GNOME切换到Xfce
  • 扫描文件 PDF / 图片 纠斜 | 图片去黑边 / 裁剪 / 压缩
  • I2C集成电路总线
  • Semi-Supervised Single-View 3D Reconstruction via Prototype Shape Priors
  • 基于Java Spring Boot开发的旅游景区智能管理系统 计算机毕业设计源码32487
  • linux网络编程之单reactor模型(一)
  • Python 数据建模与分析项目实战预备 Day 2 - 数据构建与字段解析(模拟简历结构化数据)
  • 【前端】【组件库开发】【原理】【无框架开发】现代网页弹窗开发指南:从基础到优化
  • GNhao,获取跨境手机SIM卡跨境通信新选择!
  • 手机恢复出厂设置怎么找回数据?Aiseesoft FoneLab for Android数据恢复工具分享
  • Java中的泛型继承
  • 深度学习篇---昇腾NPUCANN 工具包
  • 《Java EE与中间件》实验三 基于Spring Boot框架的购物车
  • BLOB 数据的插入与读取详解
  • Linux驱动学习day22(interrupt子系统)
  • [python]在drf中使用drf_spectacular
  • 卢比危机下的金融破局:科伦坡交易所技术升级作战图
  • SpringBoot JWT
  • NFS文件存储及论坛项目搭建(php)
  • Web攻防-SSTI服务端模版注入利用分类语言引擎数据渲染项目工具挖掘思路
  • MCU芯片内部的ECC安全机制
  • OpenCV图像基本操作:读取、显示与保存
  • 《数据库》MySQL备份回复
  • AI加持的开源知识库新秀:PandaWiki,如何用它打造智能化文档系统?
  • 新作品:吃啥好呢 - 个性化美食推荐
  • [面试] 手写题-爬楼梯,斐波那契数列
  • 利用Claude code,只用文字版系统设计大纲,就能轻松实现系统~
  • Kafka——应该选择哪种Kafka?
  • 京东携手HarmonyOS SDK首发家电AR高精摆放功能