2021-09-04:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost
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)
}
执行结果如下:

拓展题:
前后端数据如何统一验证呢?比如前端输入要求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的更多相关文章
- 2021.11.04 P1392 取数(多路归并)
2021.11.04 P1392 取数(多路归并) P1392 取数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 在一个n行m列的数阵中,你须在每一行取一个数(共n个数) ...
- 2021.09 ccf csp 第四题 收集卡牌
2021.09 ccf csp 第四题 收集卡牌 思路 这题如果直接计算,因为不同的分类种数太多,枚举所有的分类情况是一个几乎不可能的复杂任务. 但不同摸牌次数,不同已摸出牌种类的子问题的答案之间,具 ...
- lintcode 中等题:Max Points on a Line 最多有多少个点在一条直线上
题目 最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- 一条直线上N个线段所覆盖的总长度
原文:http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线 ...
- 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 ...
- [小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上
这一部分,我准备向大家介绍Selenium WebDriver的常用API,学习这部分内容需要大家最好有一些简单的HTML相关知识,本文主要涉及到以下内容: Selenium API:元素检查 Sel ...
- lintcode-186-最多有多少个点在一条直线上
186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- JS原生上传大文件显示进度条-php上传文件
JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M post_max_size = 10M memory_li ...
- java 判断点是否在一条线段上
public static void main(String[] args) { Scanner scan = new Scanner(System.in); Point point1 = new P ...
- python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html
前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...
随机推荐
- python调用adb shell
最近在用python做一个小工具,自动执行一些adb shell命令,使用subprocess.Popen来实现. 不过遇到个问题就是执行adb shell后就无法执行后面adb shell里的命令了 ...
- jwt auth0 和 jsonwebtoken比较
参考: https://blog.csdn.net/lizz861109/article/details/104614942/
- WinForm分辨率适应-高DPI自动缩放
https://www.cnblogs.com/alittlecooing/p/WinForm-HighDPI.html 新建app.manifest文件后,去掉注释就可
- 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题
子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...
- DVWA-Weak Session IDs(弱会话ID) 不安全的会话
在登录服务器之后,服务器会返回给用户一个会话(session),这个会话只会存在一段时间,拥有这个会话下次登录就不用输入密码就可以登录到网站,如果返回的这个会话很弱,容易被猜解到,就很不安全,照成会话 ...
- Python学习笔记--数据输出
数据输出 输出为Python对象 collect算子 具体实现: reduce算子 具体实现: take算子 具体实现: count算子 具体实现: 输出到文件中 saveAsTextFile算子 具 ...
- QGIS 导入文本数据(WKT)
在做GIS数据处理的时候,经常会遇到原始数据是 text.csv.Excel 等格式的数据.要使用数据前提是要先转换数据. 这里是介绍用 QGIS 导入数据.打开导入方式如下(根据自己的文本类型选择不 ...
- Terraform 系列-Terraform 项目的典型文件布局
系列文章 Terraform 系列文章 典型文件布局 - modules/ - services/ - webserver-cluster/ - examples/ - main.tf - outpu ...
- .net6的IIS发布部署
1.打开控制面板,打开程序 2.点击启动或关闭windows功能 3.在其中选择要设置的IIS功能 4.重启IIS服务 5.发布项目 6.在开始菜单搜索IIS,点击IIS管理器 7.右击网站,点击添加 ...
- [大数据]ETL之增量数据抽取(CDC)
关于:转载/知识产权 本文遵循 GPL开源协议,如若转载: 1 请发邮件至博主,以作申请声明. 2 请于引用文章的显著处注明来源([大数据]ETL之增量数据抽取(CDC) - https://www. ...