134. 加油站
贪心
import java.util.Arrays;
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
/**
* 如果总的油量小于总的消耗量,那肯定无法跑一圈
*/
if (Arrays.stream(gas).sum() - Arrays.stream(cost).sum() < 0){
return -1;
}
int n = gas.length;
int start = 0;
int sum = 0;
/**
* 从第一个加油站开始跑,每到一个加油站就统计总的剩余油量
* 如果大于等于0那就可以接着跑
* 如果小于0说明当前选的起始位置不对,将下一个加油站设置为新的起始点,重置循环次数和总的剩余油量
* 因为这个循环是环形的,所以要用while循环,当到达最后一个加油站,下一个要手动设置为第一个
*/
while (n >= 0){
if (start == gas.length){
start = 0;
}
sum += gas[start] - cost[start];
if (sum >= 0){
start++;
n--;
}
else {
start++;
n = gas.length;
sum = 0;
}
}
/**
* 当完整的跑完一圈以后,start会停在起点的下一个位置
*/
return start - 1;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——同步计算总差值
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int start = 0;
int sum = 0;
int totalSum = 0;
/**
* 直接在循环中用totalSum统计总的油量和消耗量的差
* 如果当前位置的油量sum小于0,就将起点设置为下一个
* 环形数组的索引需要对长度取余
*/
for (int i = 0; i < gas.length; i++) {
sum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if (sum < 0){
sum = 0;
start = (i + 1) % gas.length;
}
}
/**
* 如果totalSum小于0,肯定不能跑一圈
*/
if (totalSum < 0){
return -1;
}
return start;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理