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);