数组 a [] 仅包含 1和0 。
我们希望通过交换位置获得1的(大于或等于n)的连续序列。
如何在最小交换操作中执行此类任务。
我们可以交换任意两个职位。
这里输出从数组a [] 创建大于或等于n 1的连续段所需的最小数量交换操作。
数组长度< = 10 ^ 5。
例如 -
INPUT:
a[5]={1,0,1,0,1}
n=2
OUTPUT:
1
答案 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的数量 任何指数的权利。迭代所有可能的最终安排,并且 通过从这两个中添加适当的值来计算交换次数 阵列。