134. 加油站 Krains 2020-08-20 14:03:21 前缀和贪心
时间:2022-07-23
本文章向大家介绍134. 加油站 Krains 2020-08-20 14:03:21 前缀和贪心,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
解题思路
- 首先明确一点,如果加油站提供的油总和大于等于花费的油总和,那么必定可以绕环路行驶一周
- 我们尝试从编号0出发,不管油够不够,一直走到尾,期间记录gas[i]与cost[i]差值的总和sum,同时计算行驶过程中油箱中油量的最小值min(可以为负)。
- 如果总和sum<0,那么无论如何都不能够环绕一周,如果大于等于0,那么一定可以环绕一周
- 如果此时min>=0,那么行驶过程中油箱始终不为空,此时可以从0出发环绕一周
- 如果min<0,那么考虑更换起点,从右往左枚举起点,此时行驶方向还是从左往右,将min补充到大于0的点就是能够环绕一周的起始点,因为此时从新的起点出发,那么min>=0,这表示行驶过程中油箱始终不为空。
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int sum = 0;
int min = 0;
for(int i = 0; i < gas.length; i++){
// 统计加油量和耗油量
sum += gas[i] - cost[i];
min = Math.min(min, sum);
}
// 如果小于0,则不能环绕一周
if(sum < 0)
return -1;
// 此时从起点出发能够环绕一周
if(min >= 0)
return 0;
for(int i = gas.length-1; i >= 0; i--){
int diff = gas[i] - cost[i];
min += diff;
// 如果该点能够将min补充到大于等于0,则该点为起点
if(min >= 0)
return i;
}
return -1;
}
}
# 前缀和求最大子数组和
与该题十分类似53. 最大子序和
当然也需要借助贪心的思想,如果总加油量和耗油量大于等于0那么总可以环绕一周,我们用diff[i]=gas[i]-cost[i]
得到一个数组,我们找到是该数组的最大子数组和的开始元素索引k,从k出发总能环绕一周。
因为数组是一个环路,我们可以将数组diff复制一份到该数组的末尾,然后用前缀和求出最大子数组和。
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
// 前缀和
int sum = 0;
// 记录遍历过程中的最小前缀和,初始化为0表示前缀和的首元素是0
int min = 0;
int j = 0;
int k = 0;
int maxSum = 0;
int n = gas.length;
int[] diff = new int[2 * n];
for(int i = 0; i < n; i++){
diff[i] = gas[i] - cost[i];
diff[i+n] = diff[i];
}
for(int i = 0; i < diff.length; i++){
sum += diff[i];
// 求最大子数组,更新下标k
if(sum-min > maxSum){
maxSum = sum-min;
k = j;
}
// min是当前最小的前缀和,j记录最小前缀和的开始元素下标
if(min > sum){
j = i+1;
min = sum;
}
}
if(sum < 0)
return -1;
return k % n;
}
}
- docStrings报错
- java中如何初始化接口
- 你和PPT高手之间,就只差一个iSlide
- 如何在原生微信小程序中实现数据双向绑定
- 追溯 React Hot Loader 的实现
- 【推荐】开源项目minapp-重新定义微信小程序的开发
- 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
- hadoop性能调优
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
- DiscuzX v3.4 任意文件删除漏洞
- 系列3|走进Node.js之多进程模型
- Java中Arraylist与linkedlist的区别
- 手把手教你撸一个 Webpack Loader
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法