加油站的良好出发点问题

作者:Grey

原文地址:

博客园:加油站的良好出发点问题

CSDN:加油站的良好出发点问题

题目描述

题目链接

思路

暴力解法 O(N^2)

我们可以通过生成辅助数组来验证良好出发点

int[]h

这个数组的长度和cost数组长度一致,且这个数组的每个元素的生成逻辑是:

h[i]=gas[i]-cost[i];

我们可以很容易得到一个结论:h(i) 往后累加,并回到i位置,不出现负数,就是良好出发点 ,这个i位置就是良好出发点。

以每个位置作为i位置,依次走这个逻辑,所以这个解法的复杂度是 O(N^2),代码如下:

    public int canCompleteCircuit(int[] gas, int[] cost) {int len = cost.length;int[] helper = new int[len];for (int i = 0; i < helper.length; i++) {helper[i] = gas[i] - cost[i];}int pre = 0;for (int i = 0; i < len; i++) {pre = helper[i];if (pre < 0) {continue;}for (int j = i + 1; j < len + i + 1; j++) {pre += helper[j < len ? j : (j - len)];if (pre < 0) {break;}}if (pre >= 0) {return i;}}return -1;}

滑动窗口 时间复杂度 O(N) 空间复杂度 O(N)

首先,我们还是需要生成h[i]数组

h[i]=gas[i]-cost[i];

假设生成的h[i]数组如下:

[1,-1,0,3,-1]

我们生成其累加和数组preSum[i]

[1,0,0,3,2]

用这个累加和数组再和h[i]数组相加,得到一个两倍长度的数组

[1,0,0,3,2,3,2,2,5,4]

求针对这个数组,滑动窗口为n(n为原数组长度)的最小值,如果第i个窗口内的最小值减去窗口前一个位置的值小于0,则i号位置不是良好出发点

比如

L...L + n - 1是第x个窗口,最小值m

如果:

m - h[L-1] >= 0

则x是良好出发点

反之,则x不是良好出发点, 完整代码:

public static int canCompleteCircuit(int[] gas, int[] cost) {int len = gas.length;int doubleLen = len << 1;int[] h = new int[doubleLen];h[0] = gas[0] - cost[0];for (int i = 1; i < doubleLen; i++) {if (i < len) {h[i] = gas[i] - cost[i];h[i] += h[i - 1];}if (i >= len) {h[i] = h[len - 1] + h[i - len];}}LinkedList<Integer> qMin = new LinkedList<>();int r = 0;int index = 0;while (r < doubleLen) {while (!qMin.isEmpty() && h[qMin.peekLast()] >= h[r]) {qMin.pollLast();}qMin.addLast(r);if (qMin.peekFirst() == r - len) {qMin.pollFirst();}if (r >= len - 1) {if (r == len - 1) {if (h[qMin.peekFirst()] >= 0) {return index;}} else {if (h[qMin.peekFirst()] - h[r - len] >= 0) {return index;}}index++;}r++;}return -1;}

更进一步,如果每个位置都这样求,就可以得到每个位置是否是良好出发点,代码如下:

public static boolean[] canCompleteCircuitOfAllPositions(int[] gas, int[] cost) {int N = gas.length;int[] h = new int[N];for (int i = 0; i < N; i++) {h[i] = gas[i] - cost[i];}int R = N << 1;int[] doubleLenOfHelper = new int[R];doubleLenOfHelper[0] = h[0];for (int i = 1; i < N; i++) {doubleLenOfHelper[i] = h[i] + doubleLenOfHelper[i - 1];}for (int i = 0; i < N; i++) {doubleLenOfHelper[i + N] = h[i] + doubleLenOfHelper[i + N - 1];}LinkedList<Integer> q = new LinkedList<>();boolean[] res = new boolean[R - N + 1];int index = 0;for (int i = 0; i < R; i++) {while (!q.isEmpty() && doubleLenOfHelper[i] <= doubleLenOfHelper[q.peekLast()]) {q.pollLast();}q.addLast(i);if (q.peekFirst() == (i - N)) {q.pollFirst();}// 窗口已经形成了if (i >= N - 1) {if (i == N - 1) {res[index++] = (doubleLenOfHelper[q.peekFirst()] >= 0);} else {res[index++] = ((doubleLenOfHelper[q.peekFirst()] - doubleLenOfHelper[i - N]) >= 0);}}}// res[i]位置存着每个位置是否为良好出发点return res;}

更多

算法和数据结构笔记

参考资料

算法数据结构体系学习班

加油站的良好出发点问题相关推荐

  1. 算法:加油站的良好出发点问题

    题目描述 N个加油站组成一个环形,给定两个长度都是N的非负数组 oil和dis(N>1),oil[i]代表 第i个加油站存的油可以跑多少千米,dis[i]代表第i个加油站到环中下一个加油站相隔 ...

  2. 【加油站的良好出发点问题】

    从哪个加油站开始可以转一圈? 弄一个arr[]=gas[]-cost[],中途累加不能小于0 public static int canCompleteCircuit(int[] gas, int[] ...

  3. 加油站良好出发点问题

    加油站良好出发点问题 题目描述 N个加油站组成一个环形,给定两个长度都是N的非负数组oil和dis(N>1),oil[i]代表第i个加油站存的油可以跑多少千米,dis[i]代表第i个加油站到环中 ...

  4. Leetcode 134. 加油站 解题思路及C++实现

    方法一:直接暴力方法 解题思路: 当 gas[i] >= cost[i] 时,这个加油站才可能是个出发点,遍历gas容器(数组),当出现 gas[i] >= cost[i] 时,看看以这个 ...

  5. 【加油站会员管理小程序】01需求分析

    随着这两年微搭产品的迭代,目前组件基本够用,像常用的支付这种功能也是有的,因此我们就可以结合现有功能来完成一个实际使用的小程序的开发. 我们本次的实战课,是以加油站的业务场景为出发点,涵盖会员的开通. ...

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

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  7. 拥抱AI视觉,加油站可以很“智慧”

    油库.油站.卸油车储存大量的成品燃油,安全是重中之重. 尤其卸油过程最容易发生安全隐患,油罐车动态管理困难,卸油过程没有实时视频.数据分析.告警机制等,事后调查取证困难. 如何用智能化手段加强加油站安 ...

  8. 贪心算法--加油站问题

    一个汽车加满油后可以行使n千米,图中会经过一系列加油站,求到达最终加油的最少次数,给出每个加油站之间的距离. #include<stdio.h> #define n 7//n表示汽车加满油 ...

  9. 淮阴工学院研究生计算机,先鸣论坛第六期/考研加油站(五)|2017届淮阴工学院计算机学院考研最高分王杰和你一起分享他的考研经验...

    原标题:先鸣论坛第六期/考研加油站(五)|2017届淮阴工学院计算机学院考研最高分王杰和你一起分享他的考研经验 若有恒 何须三更眠五更起 最无益 莫过一日曝十日寒 吾尽吾心,终亦不悔: 天道酬勤,何事 ...

最新文章

  1. PHP反射ReflectionClass、ReflectionMethod 入门教程
  2. Solr配置与简单Demo[转]
  3. Java迭代器使用注意
  4. 高电压技术思维导图_钢铁技术:钢铁行业板坯连铸结晶器振动常见故障思维导图...
  5. SpringOne Platform 2016回顾
  6. Android IntentService使用
  7. php phar,PHP中phar(PHP Archive)包的创建并使用
  8. 基金小白要如何入门?
  9. “人生没有一桩幸福不要付代价的。东边占了便宜,西边就得吃亏些。”--《傅雷家书》
  10. 22. Window print() 方法
  11. QQ空间爬虫分享(2016年11月18日更新)
  12. Matlab求解微分、积分方程
  13. Android P 缩短screencap时间
  14. python读取pdf提取文字和图片
  15. 记一次简单的企业微信推送消息开发(第三方应用开发)
  16. 数字金额转化为大写金额(js)
  17. 基于滑窗捕获的伪卫星系统抗远近效应方法研究
  18. 协议:GRE;collisions
  19. The package javax.swing is not accessible(java GUI 编程时引用swing包和awt包时会报错怎么办)
  20. PDF文件制作方法与指南

热门文章

  1. java代餐计算器_java入门7 - 千言sully的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. docker挂载内容与容器内容不同步(有时候延迟同步)
  3. 揭秘“宫廷医案的养生法”,《养生堂》御品膏方专场节目
  4. TASKCTL调度监控中常见问题
  5. 2013年7月微软MVP申请开始啦!
  6. python的Django项目配置运行(pyCharm)
  7. animate用法 js原生_animateplus.js 教程
  8. npm install 报错
  9. 8年经验机器人设计师,教你如何成为一名优秀的机械设计师
  10. [开源项目]Android_炫酷的3D音乐播放器_各种特效OpenGL