最小交换操作

时间:2014-03-01 17:10:11

标签: algorithm

数组 a [] 仅包含 1和0

我们希望通过交换位置获得1的(大于或等于n)的连续序列。

如何在最小交换操作中执行此类任务。

我们可以交换任意两个职位。

这里输出从数组a [] 创建大于或等于n 1的连续段所需的最小数量交换操作。

数组长度< = 10 ^ 5。

例如 -

INPUT:

a[5]={1,0,1,0,1}

n=2

OUTPUT:

1

4 个答案:

答案 0 :(得分:3)

从前面扫描,直到你得到0,然后从后面扫描,直到你得到1.交换它们。交换是必要的,应该清楚这两个元素不需要再次交换。从当前位置重复此过程,直到您的参考索引在中间相遇。

将完成所有必要的交换,并且每个需要交换的元素只会发生一次。我看不出你可以做多少交换。

答案 1 :(得分:2)

从左侧浏览数组,跟踪当前位置左侧n位置的1的计数。

对于每个元素,如果它是1,则可以很容易地增加一个计数器,如果左边的元素n位置是1,则可以减少计数器。

现在我们需要做的就是跟踪上面的最大数量 - n - this将是最小数量的互换。

哦,我们应该通过并检查数组中是否有n 1。

这将需要O(n)

答案 2 :(得分:0)

根据我的理解,您尝试使用最少的互换次数将数组a[4]={1,0,1,0}排序为a[4]={1,1,0,0}

可能不需要像下面那样进行任何交换

int a[4]={1,0,1,0}

for(int i=0;i<a.length;i++)
{
if(a[i] == 1 && a[i+1] != a[i+2])
{
a[i+1] = a[i+1]+a[i+2];
a[i+2] = a[i+1]-a[i+2];
a[i+1] = a[i+1]-a[i+2];
}
}

答案 3 :(得分:0)

取一个1和0的数组。我们想要找到最终连续n 1s序列所需的交换次数:

1, 0, 1, 0, 1, 1

此阵列有4种可能的最终安排。交换数量 对于每个排列,是原始数组中的0的数量 在与最终数组中的1相同的位置:

1, 1, 1, ?, ?, ? - 1 swap
?, 1, 1, 1, ?, ? - 2 swaps
?, ?, 1, 1, 1, ? - 1 swap
?, ?, ?, 1, 1, 1 - 1 swap

这可以通过创建两个数组在线性时间中找到:运行总计 任何索引左边的0的数量,以及0的数量 任何指数的权利。迭代所有可能的最终安排,并且 通过从这两个中添加适当的值来计算交换次数 阵列。