如何将元素1与数组中的0交换(仅包含1和0),以便所有1都在一起

veg*_*yan 0 java arrays

如何解决以下编程问题.

有一个数组只包含0s1s按随机顺序排列.的位置1可以与任何位置被切换0.什么是所需的最小交换数量,以便所有交换1s在一起.

解决这个问题的最佳方法是什么?我甚至无法想出蛮力的方法.

例如,考虑以下数组(索引从0开始)

  1. 数组大小14 1 0 0 0 1 0 1 0 1 0 0 0 0 1

  2. 第一次传递后0 0 0 0 1 1 1 0 1 0 0 0 0 1(索引0与索引5交换)

  3. 第二次传球后0 0 0 0 1 1 1 1 1 0 0 0 0 0(指数7与指数13交换)

需要两次交换才能将所有内容1s整合在一起

das*_*ght 7

首先,计算1s 的数量(让我们称之为k).这可以在O(n)中完成.

接着,通过行走该阵列,并计算后的总和k每个索引元件i之间kn.这也可以在O(n)中完成,通过使用先前元素的和加上当前值减去位置上的值i-k.

互换的数量等于k-max(sum).

在你的例子中,k是5. k-sums如下:

1 0 0 0 1 0 1 0 1 0 0 0 0 1
- - - - 2 1 2 2 3 2 2 1 1 1
Run Code Online (Sandbox Code Playgroud)

最高总和为3,因此交换数量为5-3 = 2.

注意:算法的直观原理很简单:总和最高的位置是1组合在一起的s 的运行结束的地方,因为它在k索引块中具有最高的"浓度" .这是您要复制1的位置,您需要复制k-max剩余的1s.