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

力扣网编程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.dtcms.com/a/274122.html

相关文章:

  • Android15 无法接收到应用自身发出的广播分析解决
  • 【牛客刷题】dd爱科学1.0
  • Java 大视界 -- Java 大数据在智能医疗远程手术机器人操作数据记录与分析中的应用(342)
  • 从静到动的创作革命:Midjourney Video V1重塑AI影像叙事
  • 滑动窗口-3.无重复字符的最长子串-力扣(LeetCode)
  • 【Linux】虚拟内存的概念和布局
  • UI自动化神器:Playwright元素定位方法!
  • 新型变种木马正在伪装成Termius入侵系统
  • Kotlin 常用语法糖完整整理
  • 【springboot】IDEA手动创建SpringBoot简单工程(无插件)
  • 【零基础学AI】第37讲:提示词工程(Prompt Engineering)
  • NLP_知识图谱_大模型——个人学习记录
  • 解决MySQL虚拟删除影响唯一索引的问题
  • 《PyWin32:Python与Windows的桥梁,解锁系统自动化新姿势》
  • 从0开始学习R语言--Day44--LR检验
  • 外媒:蚂蚁数科等科技公司在香港数字资产枢纽建设中显身手
  • python 在 Linux CentOS 上安装 playwright 的完整步骤
  • 【每日刷题】回文数
  • 【数据结构】8. 二叉树
  • 【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
  • leetcode106深度解析:从中序与后序遍历序列构造二叉树
  • leetcode:518. 零钱兑换 II[完全背包]
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_congestion_control
  • (LeetCode 每日一题) 3169. 无需开会的工作日 ( 排序+贪心 )
  • 力扣_二叉搜索树_python版本
  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • 【unitrix】 4.21 类型级二进制数基本结构体(types.rs)
  • 李沐动手学深度学习Pytorch-v2笔记【07自动求导代码实现】
  • 进程管理中的队列调度与内存交换机制
  • Jenkins 系统管理与配置