环游世界寻找起点

时间:2019-07-07 05:02:01

标签: java arrays algorithm loops

我必须找到最小索引才能像这样开始两个数组:

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

1 个答案:

答案 0 :(得分:0)

当前,您使用position + 1来计算下一个位置,但是如果没有以前使用的% n在圆形分度位置本身中,它就不会循环包装。

因此,for循环末尾的if else语句应该可以被以下使用循环索引的语句代替。

int nextPosition = (position + 1) % n;
if (nextPosition != starts) {
    total += cities.get(nextPosition);
}

这就是我在代码中可能看到的所有问题,因此如果没有一些失败的测试用例,我将无法为您提供进一步的帮助。