Java 从给定数组输入转换到另一个数组的最小移动量是多少

Java 从给定数组输入转换到另一个数组的最小移动量是多少,java,arrays,algorithm,Java,Arrays,Algorithm,我有一个source数组[2,5,0,1,7],现在在这个数组中,要求我可以使用数组中的值0作为占位符,我可以使用该占位符仅通过1位置左侧或右侧来交换元素 Eg: moving right the array [2, 5, 0, 1, 7] results in [2, 5, 1, 0, 7] Eg: moving left the array [2, 5, 0, 1, 7] results in [2, 0, 5, 1, 7] 如果值0的索引位于开始或结束位置,则它会旋转到下一个索引 也就是

我有一个
source
数组
[2,5,0,1,7]
,现在在这个数组中,要求我可以使用数组中的值
0
作为占位符,我可以使用该占位符仅通过
1
位置
左侧或右侧来交换元素

Eg: moving right the array [2, 5, 0, 1, 7] results in [2, 5, 1, 0, 7]
Eg: moving left the array [2, 5, 0, 1, 7] results in [2, 0, 5, 1, 7]
如果值
0
的索引位于
开始
结束
位置,则它会旋转到下一个
索引

也就是说,如果值
0
的索引位于
array.length
处,则向右移动将使其位于
array[0]

Eg: moving right the array [2, 5, 7, 1, 0] results in [0, 2, 5, 7, 1]
类似地,如果值
0
位于数组的索引
0
,则向左移动将与
array[array.length]

Eg: moving left the array [0, 5, 7, 1, 2] results in [5, 7, 1, 2, 0]
现在找到将源数组转换为给定的
目标
数组
[0,2,5,1,7]
所需的最小步骤数

Step 1: move 0 from index 2 to index 1 and swap elements

[2, 0, 5, 1, 7]

Step 2: move 0 to left postion
[0, 2, 5, 1, 7]

For this question, the answer should be 2.
问题的特征如下所示:

public int getMinimumMoves(int[] a, int[] b) {

}
我有以下几种方法,但时间复杂度更高

方法1:向右移动阵列a,直到a.length乘以 验证它是否在任何位置与数组b匹配

方法2:将阵列a向左移动,直到a.length乘以 验证它是否在任何位置与数组b匹配

获得上述两种方法中的最小值。此外,解决方案可能不可行,在这种情况下,代码应返回
-1


请告诉我解决此问题的正确方法是什么?

请验证阵列的大小是否相同:

int size = a.size();
if (size != b.size()) return -1; //size mismatch
重新生成不带0的阵列并比较它们:

int[] c = new int[size - 1];
int[] b = new int[size - 1];
int aIndex = -1;
int bIndex = -1;
for (int i = 0; i < size; ++i) {
    if (a[i] == 0) {
        if (aIndex >= 0) return -1; //second occurrence of 0 in a
        aIndex = i;
    }
    else c[aIndex < 0 ? i : i - 1] = a[i];
    if (b[i] == 0) {
        if (bIndex >= 0) return -1; //second occurrence of 0 in b
        bIndex = i;
    }
    else d[bIndex < 0 ? i : i - 1] = b[i];
}
for (int i = 0; i < size - 1; ++i) {
    if (c[i] != d[i]) return -1; //comparison fails
}
if (aIndex < 0 || bIndex < 0) return -1; //0 not present in a or b

运行时为O(大小)。

每个数组中只有一个
0
?您只能移动数组
a
?是否承诺会有解决方案?您不需要真正移动阵列。。。假设它们
可以匹配,你只需计算从右到左的零距离之间的最小值(可以在
O(n)
中完成)。@Yonlif,1。是每个数组中只有一个
0
。2.
您只能移动阵列a
,该要求没有任何此类限制。3.给定的输入不需要有解决方案。@Yonlif,我更新了我的问题,有可能给定的输入无法转换为其他数组,在这种情况下,程序应该返回
-1
return Math.min(Math.abs(aIndex - bIndex), Math.abs((aIndex + size) % size) - bIndex);