2021-09-04:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明: 如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。力扣134。

福大大 答案2021-09-04:

纯能数组。gas[i]-distance[i]。
时间复杂度:O(N)。
额外空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
gas := []int{1, 2, 3, 4, 5}
cost := []int{3, 4, 5, 1, 2}
ret := canCompleteCircuit(gas, cost)
fmt.Println(ret)
} func canCompleteCircuit(gas []int, cost []int) int {
if len(gas) == 0 {
return -1
}
if len(gas) == 1 {
return twoSelectOne(gas[0] < cost[0], -1, 0)
}
good := stations(cost, gas)
for i := 0; i < len(gas); i++ {
if good[i] {
return i
}
}
return -1
} func twoSelectOne(c bool, a int, b int) int {
if c {
return a
} else {
return b
}
} func stations(cost []int, gas []int) []bool {
if len(cost) < 2 || len(cost) != len(gas) {
return nil
}
init0 := changeDisArrayGetInit(cost, gas)
if init0 == -1 {
return make([]bool, len(cost))
} else {
return enlargeArea(cost, init0)
}
} func changeDisArrayGetInit(dis []int, oil []int) int {
init0 := -1
for i := 0; i < len(dis); i++ {
dis[i] = oil[i] - dis[i]
if dis[i] >= 0 {
init0 = i
}
}
return init0
} func enlargeArea(dis []int, init0 int) []bool {
res := make([]bool, len(dis))
start := init0
end := nextIndex(init0, len(dis))
need := 0
rest := 0
for {
// 当前来到的start已经在连通区域中,可以确定后续的开始点一定无法转完一圈
if start != init0 && start == lastIndex(end, len(dis)) {
break
}
// 当前来到的start不在连通区域中,就扩充连通区域
// start(5) -> 联通区的头部(7) -> 2
// start(-2) -> 联通区的头部(7) -> 9
if dis[start] < need { // 当前start无法接到连通区的头部
need -= dis[start]
} else { // 当前start可以接到连通区的头部,开始扩充连通区域的尾巴
// start(7) -> 联通区的头部(5)
rest += dis[start] - need
need = 0
for rest >= 0 && end != start {
rest += dis[end]
end = nextIndex(end, len(dis))
}
// 如果连通区域已经覆盖整个环,当前的start是良好出发点,进入2阶段
if rest >= 0 {
res[start] = true
connectGood(dis, lastIndex(start, len(dis)), init0, res)
break
}
}
start = lastIndex(start, len(dis))
if start == init0 {
break
}
} //for (start != init0);
return res
} // 已知start的next方向上有一个良好出发点
// start如果可以达到这个良好出发点,那么从start出发一定可以转一圈
func connectGood(dis []int, start int, init0 int, res []bool) {
need := 0
for start != init0 {
if dis[start] < need {
need -= dis[start]
} else {
res[start] = true
need = 0
}
start = lastIndex(start, len(dis))
}
} func lastIndex(index int, size int) int {
return twoSelectOne(index == 0, (size - 1), index-1)
} func nextIndex(index int, size int) int {
return twoSelectOne(index == size-1, 0, index+1)
}

执行结果如下:


左神java代码

拓展题:
前后端数据如何统一验证呢?比如前端输入要求6-16个字符,后端也做6-16个字符的验证。前后端分开验证,前后端都得开发,工作量增加。如何做到前端做验证,后端验证直接使用前端的规则?这样后端就不用开发了,工作量就减少了。

福大大 答案2021-09-04:

用js写验证api,前后端调用。
js、joi、request-validate、jsonschma、swagger。

2021-09-04:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost的更多相关文章

  1. 2021.11.04 P1392 取数(多路归并)

    2021.11.04 P1392 取数(多路归并) P1392 取数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 在一个n行m列的数阵中,你须在每一行取一个数(共n个数) ...

  2. 2021.09 ccf csp 第四题 收集卡牌

    2021.09 ccf csp 第四题 收集卡牌 思路 这题如果直接计算,因为不同的分类种数太多,枚举所有的分类情况是一个几乎不可能的复杂任务. 但不同摸牌次数,不同已摸出牌种类的子问题的答案之间,具 ...

  3. lintcode 中等题:Max Points on a Line 最多有多少个点在一条直线上

    题目 最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...

  4. 一条直线上N个线段所覆盖的总长度

    原文:http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线 ...

  5. LeetCode:149_Max Points on a line | 寻找一条直线上最多点的数量 | Hard

    题目:Max Points on a line Given n points on a 2D plane, find the maximum number of points that lie on ...

  6. [小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上

    这一部分,我准备向大家介绍Selenium WebDriver的常用API,学习这部分内容需要大家最好有一些简单的HTML相关知识,本文主要涉及到以下内容: Selenium API:元素检查 Sel ...

  7. lintcode-186-最多有多少个点在一条直线上

    186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...

  8. JS原生上传大文件显示进度条-php上传文件

    JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M    post_max_size = 10M    memory_li ...

  9. java 判断点是否在一条线段上

    public static void main(String[] args) { Scanner scan = new Scanner(System.in); Point point1 = new P ...

  10. python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html

    前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...

随机推荐

  1. Tcp网络模型

    要摸清网络,那么第一步肯定是要清楚网络协议的分层结构,用上帝视角来看网络. 对于同一台设备上的进程间通信,有很多种方式,比如有管道.消息队列.共享内存.信号等方式,而对于不同设备上的进程间通信,就需要 ...

  2. Unity打Android包报错总结 长期更新

    报错1  Failed to compile resources with the following parameters: -bootclasspath "E:\software\And ...

  3. HTML-CSS常用代码

    注释标签:对代码进行说明<!-- 单行注释,也可以对多行文字进行注释 -->常用格式标签<b>加粗</b> <i>斜体</i> <u& ...

  4. Git 小技巧:忽略某些文件的更改

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/dp9Mwq7vf0ASF_FftBN8Ww 作为一枚合格的代码贡献 ...

  5. 文件上传 upload-labs Pass-18 条件竞争

    Pass-18 条件竞争 审计源码 $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array('jp ...

  6. DNS BIND之dnssec安全

    公司一大早域名解析出问题了,网抓项目都无法抓取到进销存数据. 查询后发现是运维周末重启了dns服务. 网上找到的解决方法: 在BIND的配置文件(/etc/named.conf)中打开DNSSEC选项 ...

  7. SpringBoot 整合 Kafka 与 Avro 【No group.id】 问题解决方法

    [问题描述]:ApplicationContextException: Failed to start bean 'org.springframework.kafka.config.internalK ...

  8. 泰拉瑞亚EasyBuildMod便捷建造模组开发详细过程

    pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } github地址: ht ...

  9. 万字长文带你入门docker

    1 Docker dockerfiler 镜像构建 Compose是在单机进行容器编排 Horbor 镜像仓库 Docker swarm 在多机进行容器编排 Docker Compose缺点是不能在分 ...

  10. window.onload / onscroll/onresize 事件

    onload当文档加载完成后执行一些操作 window.onload = function(){ console.log("页面加载完成") } onscroll当页面发生滚动时执 ...