Gas Station

来源:互联网 发布:阿里云账号注销 编辑:程序博客网 时间:2024/05/17 06:09

定义:diff[i] = gas[i] – cost[i] 0<=i <n

这题包含两个问题:

1. 能否在环上绕一圈?
2. 如果能,这个起点在哪里?

第一个问题,如果最后∑diff[i]是正值,那么肯定存在这么一个起始点。如果是负值,那说明,油的损耗大于油的供给,不可能有解。

对于第二个问题:
假设,我们从环上取一个区间[i, j], j>i, 然后对于这个区间的diff加和,定义
sum[i,j] = ∑diff[k] where i<=k<j

如果sum[i,j]小于0,那么这个起点肯定不为i,跟第一个问题的原理一样。举个例子,假设x是[0,n]的解,那么我们知道 任意sum[k,x-1] (0<=k<x-1) 肯定是小于0的,否则解就应该是k。同理,sum[x,n]一定是大于0的,否则,解就不应该是x,而是x和n之间的某个点。所以第二题的答案,其实就是在0到n之间,找到第一个连续子序列大于0的。

int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {int len = gas.size();vector<int> diff(gas.size());for (int i = 0; i<len; i++) {diff[i] = gas[i] - cost[i];}int startnode = 0;int tank = 0;int sum = 0;for (int i = 0; i<len; i++) {tank += diff[i];sum += diff[i];if (sum<0) {sum = 0;startnode = i + 1;}}if (tank<0)return -1;elsereturn startnode;}


0 0
原创粉丝点击