给定一个二进制数组,找出将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;
}
更好的解决这个程序的方法是什么?
我已经查看了这篇文章给定一个由0和1组成的数组,找到将所有1相邻交换移动的最小次数但是答案没有给出正确的输出。