leetcode-master/problems/0134.加油站.md

89 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 思路
## 方法一
来看一下贪心主要贪在哪里:
1. 如果gas的总和小于cost总和那么无论从哪里出发一定是跑不了一圈的
2. remain[i] = gas[i]-cost[i]为一天剩下的油remain[i]i从0开始计算累加到最后一站如果累加没有出现负数说明从0出发油就没有断过那么0就是起点。
3. 如果累加的最小值是负数就要从非0节点出发从后向前看哪个节点能这个负数填平。
代码如下:
```
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int min = INT_MAX; // 从起点出发,油箱里的油量
for (int i = 0; i < gas.size(); i++) {
int remain = gas[i] - cost[i];
curSum += remain;
if (curSum < min) {
min = curSum;
}
}
if (curSum < 0) return -1; // 情况1
if (min >= 0) return 0; // 情况2
// 情况3
for (int i = gas.size() - 1; i >= 0; i--) {
int remain = gas[i] - cost[i];
min += remain;
if (min >= 0) {
return i;
}
}
return -1;
}
};
```
其实这份代码还是比较复杂的。
## 方法二
换一个思路,首先如果总油量减去总消耗大于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量remain[i]相加一定是大于零的。
每个加油站的剩余量remain[i]为gas[i] - cost[i]。
i从0开始累加remain[i]和记为curSum如果curSum小于零说明 [0, i]区间都不能作为起始位置起始位置从i+1算起。
如图:
<img src='../pics/134.加油站.png' width=600> </img></div>
那么为什么[ij] 区间和为负数已经起始位置就可以是j+1呢j+1后面就不会出现更大的负数
可以这么理解 j之前出现了多少负数j后面就会出现多少正数因为耗油总和是大于零的前提我们已经确定了一定可以跑完全程
代码如下:
```
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int totalSum = 0;
int start = 0;
for (int i = 0; i < gas.size(); i++) {
curSum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if (curSum < 0) {
start = i + 1;
curSum = 0;
}
}
if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
return start;
}
};
```
> **我是[程序员Carl](https://github.com/youngyangyang04)[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png)可以找我,本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉题解对你有帮助,不要吝啬给一个👍吧!**