1题目描述
2.代码
分析:
1. 起点只能在 [0,N−1] 之间,路是环形的
2. 选择 gas[N−1] 作为初始的起点,它的下一站是 gas[0] ,那么这样的一个环形队列就很容易维护,当 gas[N−1] 作为起点时,加入到达某个 stationi 时剩余汽油小于0= 0 ,那么我们可以通过加入gas[N−2] ,使之构成了以 gas[N−2] 为起点的旅程。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int start = gas.size()-1;
int end = 0;
int sum = gas[start] - cost[start];
while(start > end) {
if(sum >= 0) {
sum += gas[end] - cost[end];
++end;
} else {
--start;
//原起点的上一个加油站,选为起点
sum += gas[start] - cost[start];
}
}
return sum >= 0? start:-1;
}
};
参考leetcode:这里
2.2 双端队列(笔者)
显然,我们也可以通过使用双端队列完成上面的过程,而上面的代码实际模拟的就是一个双端队列。
使用双端队列实现的前插入和后插入,比较容易理解。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int start = gas.size()-1;
int next = 0;
int sum = gas[start] - cost[start];
deque<int> q;
q.push_back(start);
int count = 1, total = gas.size();
while(count < total) {
if(sum > 0) {
q.push_front(next);
sum += gas[next] - cost[next];
next++;
} else {
q.push_back(--start);
sum += gas[start] - cost[start];
}
count++;
}
return sum >= 0? start : -1;
}
};
联系邮箱:sysuygm@163.com