如何解决以下编程问题。
有一个数组只包含0s
和1s
的随机顺序。可以使用1
的任何位置切换0
的位置。所需的最小交换次数是多少,以便所有1s
在一起。
解决此问题的最佳方法是什么?我甚至无法想出蛮力的方法。
例如,考虑以下数组(从0开始的索引)
数组大小14 1 0 0 0 1 0 1 0 1 0 0 0 0 1
第一次通过后0 0 0 0 1 1 1 0 1 0 0 0 0 1
(索引0与索引5交换)
第二次传递后0 0 0 0 1 1 1 1 1 0 0 0 0 0
(索引7与索引13交换)
需要两次互换才能将所有1s
放在一起
答案 0 :(得分:7)
首先,计算1
的数量(让我们称之为k
)。这可以在O(n)中完成。
接下来,遍历数组,并计算k
和i
之间每个索引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-max
个1
。
答案 1 :(得分:1)
没有互换,
Titelslijst.Where(t => t.ID_Artiest == itemDezeWeek.ID_Artiest).Select(t => t.ID_Artiest).Max();