我必须找到最小索引才能像这样开始两个数组:
cities= [2,4,5,2] gallons = [4,3,1,3]
此问题涉及2个部分
在第一部分中,我必须查找是否存在有效的起始城市。在上面的示例中,由于城市(cities [0])的第一位置的值小于加仑的第一位置的值(gallons [0] = 4),因此我无法从第一位置开始。因此,我必须继续寻找正确的索引才能开始。我可以开始旅行的第一点是索引1,因为city [1]> =加仑[1]。此时的路径将是:
4-gallons[1] + cities[2] = 4 -3 + 5 = 6
6-gallons[2] + cities[3] = 6 -1 + 2 = 7
7-gallons[3] + cities[0] = 7 -3 + 2 = 6
6-gallons[0] = 6-4 =2
返回值为1,这是我开始旅程的索引。
下一个是无效路径,因此在这种情况下,我将必须返回-1:
cities= [8,4,1,9] gallons= [10,9,3,5]
在上面的示例中,我从索引3开始,因为它是城市大于加仑的第一个位置,因此在这种情况下的操作如下:
注意:该列表是圆形的,因此在以下示例中,下一个城市是city [0] = 8,
9-gallons[3] + cities[2] + cities[0] = 9 -5 + 8 = 12
12-gallons[0] + cities[1] = 12 -10 + 4 = 6
6-gallons[1] + cities[2] = 6 - 9 + 1
在此最终操作6-9 = -3中,由于这个原因,我们没有足够的加仑来继续旅程,因此响应为-1,我们不必继续进行该过程。
接下来是从索引0开始的另一种情况,因为city [0]> =加仑[0]:
cities[3,2,5,4] gallons = [2,3,4,2]
cities[0] - gallons [0] + cities[1] = 3-2+2 = 3
3 - gallons [1] + cities[2] = 3-3+5 = 5
5 - gallons [2] + cities[3] = 5-4+4 = 5
5 - gallons [3] = 5-2 = 3
在这种情况下,响应为0,因为我们从索引0开始并且路线是有效的,我的意思是我们总是有足够的加仑来继续行驶(我们在累积的城市总行程减去加仑之间没有负数的结果)可用,与第二种情况下的示例相反)。
下一个是到目前为止的代码,但是我在几个测试用例中失败了,我做了几个个人测试用例,但是我真的不知道为什么我的代码失败了,有什么想法吗?这两个阵列可能具有不同的维度。
public static int bestIndexToStartJorney(List<Integer> cities, List<Integer> gallons) {
int n = 0;
int starts = -1;
int total = 0;
if (cities.size() > 0 && gallons.size() > 0 && (cities.size() == gallons.size())) {
n = cities.size();
} else {
return -1;
}
for (int i = 0; i < n; i++) {
if (cities.get(i) >= gallons.get(i)) {
//Define a start point
starts = i;
break;
}
}
//If we have a valid case.
if (starts >= 0) {
total = cities.get(starts);
for (int i = 0; i < n; i++) {
//Constraints
if ((cities.get(i) < 0 || cities.get(i) > 10000) || (gallons.get(i) < 0 || gallons.get(i) > 10000)) {
starts = -1;
break;
}
//Define the current position to transverse circularly
int position = (i + starts) % n;
total += -gallons.get(position);
//If total < gallonsance the path is invalid.
if (total < 0) {
starts = -1;
break;
}
if (position < n - 1 && position + 1 != starts) {
total += cities.get(position + 1);
} else {
if (starts > 0 && position + 1 != starts)
total += cities.get(0);
}
}
}
return starts;
}
约束:
1<=size <= 100000
0<=cities[i] <= 10000
0<=gallons[i] <= 10000
答案 0 :(得分:0)
当前,您使用position + 1
来计算下一个位置,但是如果没有以前使用的% n
在圆形分度位置本身中,它就不会循环包装。
因此,for循环末尾的if else语句应该可以被以下使用循环索引的语句代替。
int nextPosition = (position + 1) % n;
if (nextPosition != starts) {
total += cities.get(nextPosition);
}
这就是我在代码中可能看到的所有问题,因此如果没有一些失败的测试用例,我将无法为您提供进一步的帮助。