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

时间:2017-05-30 18:45:36

标签: 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交换)

  4. 需要两次互换才能将所有1s放在一起

2 个答案:

答案 0 :(得分:7)

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

接下来,遍历数组,并计算ki之间每个索引k的尾随n元素的总和。这也可以在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

最高总和为3,因此掉期数为5-3 = 2。

注意:算法的直观原理很简单:总和最高的位置是组合在一起的1的运行结束的地方,因为它有k个索引块中最高的“集中度”。这是您要复制1的地方,您需要复制k-max1

答案 1 :(得分:1)

没有互换,

Titelslijst.Where(t => t.ID_Artiest == itemDezeWeek.ID_Artiest).Select(t => t.ID_Artiest).Max();
相关问题