0.前言
因设置为私密总是找不到,就发出来了,本篇文章只是写给自己的,没有参考意义,请见谅。
最近做的题目都较为简单,今天碰到了一个提交好几次才通过的。这道题是归在贪心法这一块的,但是官方题解好像不是贪心,但比较秒,于是就保存了一下。
1.题目
2. 代码
2.1本人代码
本人思路很简单,只判断当前节点能否到达下一节点。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n=gas.size();
vector<int> x(n);
for(int i=0;i<n;i++) x[i]=gas[i]-cost[i];
if(n==1&&x[0]==0) return 0;
int sum=accumulate(x.begin(),x.end(),0);
if(sum<0) return -1;
int res=0;
for(int i=0;i<n;i++){
if(x[i]<=0) continue;
else{
int gs=x[i];
for(int j=i+1;j%n!=i;++j){
gs=gs+x[j%n];
if(gs<0) break;
//cout<<gs<<endl;
}
if(gs>=0) return i;
}
}
return -1;
}
};
2.2官方代码
大佬讲解
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int i = 0;
while (i < n) {
int sumOfGas = 0, sumOfCost = 0;
int cnt = 0;
while (cnt < n) {
int j = (i + cnt) % n;
sumOfGas += gas[j];
sumOfCost += cost[j];
if (sumOfCost > sumOfGas) {
break;
}
cnt++;
}
if (cnt == n) {
return i;
} else {
i = i + cnt + 1;
}
}
return -1;
}
};