【发布时间】:2019-11-14 15:44:38
【问题描述】:
给定一个二进制数组,找出将 1 和 0 分组所需的最小相邻交换数。
示例:
Input : 0,1,0,1 (array with 0 based index)
Swaps needed : 0,1,0,1 -> 0,0,1,1 (1 swap from index 1 to index 2)
Solution : 1
示例:
Input : 1,0,1,0,0,0,0,1
Swaps needed :
1,0,1,0,0,0,0,1 -> 1,1,0,0,0,0,0,1 -> 1,1,0,0,0,0,1,0 -> 1,1,0,0,0,1,0,0 -> 1,1,0,0,1,0,0,0 -> 1,1,0,1,0,0,0,0 -> 1,1,1,0,0,0,0,0
Total 6 swaps so the solution is 6.
1 和 0 可以位于开头或结尾,但它们应位于一个位置,即开头或结尾。
我为此要求提出了以下逻辑。我在hackerrank中尝试了这个,它对一个隐藏的测试用例失败了,并且给了3个测试用例超时,因为我的代码中有嵌套循环。
static int countSwaps(List<Integer> list) {
int temp;
int swaps = 0;
int n = list.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if ((list.get(j) == 0) && (list.get(j + 1) == 1)) {
temp = list.get(j);
list.set(j, list.get(j + 1));
list.set(j + 1, temp);
swaps++;
}
}
}
return swaps;
}
解决这个程序的更好方法是什么?
我已经浏览过这篇帖子Given an array of 0 and 1, find minimum no. of swaps to bring all 1s together (only adjacent swaps allowed),但答案没有给出正确的输出。
【问题讨论】:
-
超时的原因是您实际上是手动进行交换操作,即 O(n^2)。有一种数学方法可以在不实际执行操作的情况下计算交换次数。不幸的是,我不知道这个功能,但是this solves it。不是 O(n^2),而是 O(2n) -> O(n)。
-
@Compass,我看到链接是针对
Sort Binary array,所以它总是尝试将0放在第一位。但在我的情况下,第一位可以被 0 或 1 占据 -
有一种方法可以确定排序方式,但您也可以在 O(4n) -> O(n) 处进行两种排序,并取较低的值,直到找出该公式。很确定它只是在计算哪一方有更多的#s要移动。