此题在2008年Google暑期实习生面试中出现过。
有一个环形公路上有n个加油站,第i个加油站的油量为ai。假设有一辆邮箱体积无穷大的汽车,初始邮箱是空的,汽车从加油站i行驶到加油站i+1需耗油g[i]。
问是否能够选出某个加油站作为起点,使汽车能够绕环形公路行驶一圈返回到该加油站。
实现函数int selectGasStation(int a[], int g[], int n)
,如果存在满足条件的加油站,返回该加油站的序号(0-based)。否则返回-1。
提示:n可能达到106,O(n2)的枚举算法会超出时间限制。
因为是环形公路,把这个展开成线性数组,也就是两个重复的数组排一起。看了别人的提示也才知道这一点的……
static int FindGasStation(int[] a, int[] g, int n) { int[] d = new int[2*n]; for (int i = 0; i < n; i++) { d[i] = a[i] - g[i]; d[n + i] = a[i] - g[i]; } int sum = 0; int count = 0; int result = 0; for (int i = 0; i < 2*n; i++) { if (count == n) { return result; } if (sum < 0) { sum = 0; count = 0; result = i; } sum += d[i]; count++; } return -1; }