题目
加油站,从哪个点可以跑一圈
代码
public class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
int totalgas = 0;
int totalcost = 0;
int start =0;
int cursum =0;
for(int i=0;i<n;i++){
totalgas+=gas[i];
totalcost+=cost[i];
cursum=cursum+gas[i]-cost[i];
if(cursum<0){
start =i+1;
cursum=0;
}
}
if(totalgas<totalcost){
return -1;
}
else{
return start;
}
}
}
思考
1 从这道题本身考虑。
1.1 如果totalgas > totalcost必然有解。
1.2 在有解的前提下,如果在某个点A,之前的gas-cost<0了,也就是代表从初始点到A继续不下去了。当中任何点开始到A都继续不下去了。我们可以从后面一个点,重新开始计算
1.3 既然有解,肯定会有一个点A,开始到数组结束sum>0。并且这个解再循环到前面一圈也肯定>0,因为totalgas > totalcost。而且题目说只有唯一解,那么碰到的一个点A,就是唯一的。
2 但是,其实这道题可以挖掘得很深。比如,每个点的gas-cost储存下来,这样得到的数组,就是这个点要么+ ,要么-。然后就可以转变为找寻循环数组中最大和的子数组。因为只有唯一解,只有最大和才可能是解。