2023.7.31
这题直观思路是暴力法,用一个for循环遍历所有起点,判断哪个起点能走回来。 不过最后有几个很阴间的示例通过不了:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
for(int i=0; i<gas.size(); i++)
{
int cur_gas = 0;
int j = i;
int n = gas.size();
while(n)
{
j = j % (gas.size());
cur_gas += gas[j];
if(cur_gas >= cost[j])
{
cur_gas = cur_gas - cost[j];
j++;
n--;
}
else break;
}
if(n == 0) return i;
}
return -1;
}
};
会显示超时。 得使用一个时间复杂度更低的办法。
下面是只遍历一次的思路:遍历所有起点,计算从当前加油站到下一个加油站旅行后的净汽油量保存至cur中,检查当前cur
是否为负数。如果是负数,意味着无法从当前起点出发完成环形路线,在这种情况下进行以下操作:将ans变量置为i+1,即下一个潜在有效起点。将当前的cur值加到rest值当中。最后将cur值重置为0。完成循环后,检查cur
和rest
的和是否大于等于0。如果是,意味着有足够的汽油从更新后的ans
索引出发完成环形路线,因此返回ans
的值。
下面是代码实现:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int cur = 0; //当前油量
int rest = 0; //记录当汽油不足时 不足的量
int ans = 0; //起点
for(int i=0; i<n; i++)
{
cur += gas[i]-cost[i];
// 当前起点 不支持跑完一圈
if(cur < 0)
{
ans = i + 1; //下一个潜在有效起点
rest += cur; //欠的油量
cur = 0;//当前油量重置
}
}
if(cur + rest >= 0) return ans;
else return -1;
}
};
还是有点抽象的,日后二刷。