今天写了一道题,写了半个小时还是没写出来,于是就只能求助于题解了
题目如下:
测试用例1:
测试用例2:
官方代码:
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
int i = 0;
while (i < gasSize) {
int sumGas = 0, sumCost = 0;
int cnt = 0;
while (cnt < gasSize) {
int j = (i + cnt) % gasSize;
sumGas += gas[j];
sumCost += cost[j];
if (sumCost > sumGas) {
break;
}
cnt++;
}
if (cnt == gasSize) {
return i;
} else {
i = i + cnt + 1;
}
}
return -1;
}
解题心得:
(1)首先弄清楚一个点:假设从i出发,如果无法到达j,那么从i之后的任何一个点都无法到达j(当然这些点在j之前),为什么呢?因为假设i<x<j,i到x之间必然会剩余汽油(当然也可以等于0),所以x到j之间的耗油必定大于加油量,所以每次找到的第一个不满足条件的必然是下一次的起始点*(自己写的时候没想到这个点,所以只能用暴力解法,从0开始算到gasSize-1,满足就输出,说明自己想问题想的太浅了,以后应该先思考,理清思路再开始码代码)*
(2)写的时候,卡在了在i之前的加油站的考虑,用循环写也很暴力,没有像官方题解一样用cnt这样的小技巧,所以,以后还是得多思考,多学习,多总结啊