Algorithm 最小交换操作
数组a[]仅由1和0组成 我们希望通过交换位置来获得1的连续序列(大于或等于n) 如何在最小交换操作中执行此任务 我们可以交换任意两个位置。 此处输出从数组a[]创建大于或等于n 1的连续段所需的最小交换操作数。Algorithm 最小交换操作,algorithm,Algorithm,数组a[]仅由1和0组成 我们希望通过交换位置来获得1的连续序列(大于或等于n) 如何在最小交换操作中执行此任务 我们可以交换任意两个位置。 此处输出从数组a[]创建大于或等于n 1的连续段所需的最小交换操作数。 数组长度从前面扫描直到得到0,然后从后面扫描直到得到1。交换它们。交换是必要的,应该清楚的是,这两个元素不需要再次交换。从当前位置重复该过程,直到参考索引在中间相遇。 所有必要的交换都将完成,每个需要交换的元素只会发生一次。我看不出你怎么能做比这更少的交换。从前面扫描,直到得到0,然后
数组长度从前面扫描直到得到0,然后从后面扫描直到得到1。交换它们。交换是必要的,应该清楚的是,这两个元素不需要再次交换。从当前位置重复该过程,直到参考索引在中间相遇。
所有必要的交换都将完成,每个需要交换的元素只会发生一次。我看不出你怎么能做比这更少的交换。从前面扫描,直到得到0,然后从后面扫描,直到得到1。交换它们。交换是必要的,应该清楚的是,这两个元素不需要再次交换。从当前位置重复该过程,直到参考索引在中间相遇。
所有必要的交换都将完成,每个需要交换的元素只会发生一次。根据我的理解,您正在尝试将数组
a[4]={1,0,1,0}
排序为a[4]={1,1,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];
}
}
inta[4]={1,0,1,0}
对于(inti=0;i,根据我的理解,您正在尝试使用最小交换次数将数组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];
}
}
inta[4]={1,0,1,0}
对于(int i=0;i取一个1和0的数组。我们希望找到以n 1s的连续序列结束所需的交换数:
1, 0, 1, 0, 1, 1
此阵列有4种可能的最终安排。所需的交换数量
对于每个排列,是原始数组中
在与最终数组中的1相同的位置:
1, 1, 1, ?, ?, ? - 1 swap
?, 1, 1, 1, ?, ? - 2 swaps
?, ?, 1, 1, 1, ? - 1 swap
?, ?, ?, 1, 1, 1 - 1 swap
这可以通过创建两个数组在线性时间内找到:一个运行总数
任何索引左侧的0数,以及索引左侧的0数
任何索引的右边。迭代所有可能的最终安排,以及
通过将这两个变量中的适当值相加,计算掉期数量
数组。取一个1和0的数组。我们希望找到以n个1的连续序列结束所需的交换数:
1, 0, 1, 0, 1, 1
此阵列有4种可能的最终安排。所需的交换数量
对于每个排列,是原始数组中
在与最终数组中的1相同的位置:
1, 1, 1, ?, ?, ? - 1 swap
?, 1, 1, 1, ?, ? - 2 swaps
?, ?, 1, 1, 1, ? - 1 swap
?, ?, ?, 1, 1, 1 - 1 swap
这可以通过创建两个数组在线性时间内找到:一个运行总数
任何索引左侧的0数,以及索引左侧的0数
任何索引的右边。迭代所有可能的最终安排,以及
通过将这两个变量中的适当值相加,计算掉期数量
数组。从左侧遍历数组,跟踪当前位置左侧n
位置中1的计数
对于每个元素,如果元素n
左侧的位置为1,则增加计数器,如果元素n
左侧的位置为1,则减少计数器,可以很容易地做到这一点
现在,我们需要做的就是跟踪最大的上述计数-n-这将是最小的互换数量
哦,我们可能应该检查一下数组中是否有n
1
这将需要O(n)
从左侧遍历数组,跟踪当前位置左侧n
位置的1计数
对于每个元素,如果元素n
左侧的位置为1,则增加计数器,如果元素n
左侧的位置为1,则减少计数器,可以很容易地做到这一点
现在,我们需要做的就是跟踪最大的上述计数-n-这将是最小的互换数量
哦,我们可能应该检查一下数组中是否有n
1
这将需要O(n)
所以输出应该是交换的数量?或者交换的执行说明?而不是交换。你可以加/减。就像循环数组一样->每当你找到1
时,做一个减法1-1
,对于0
做加法,就像0+1
。因为数组只包含0和1的输出应该是所需的最小交换操作数。@user2826957仅相邻交换?请记住展示您自己解决问题的尝试。因此,输出应该是交换数?或执行交换的说明?而不是交换,您可以添加/减去。就像在数组中循环->只要找到1
执行减法1-1
,对于0
执行加法,如0+1
。由于数组仅包含0和1。输出应该是所需的最小交换操作数。@用户2826957仅相邻交换?请记住展示您自己解决问题的尝试。最终位置可能不是最优的所有的1移到右边可能比移到左边更好。最终的位置可能不是最优的。将所有的1移到右边可能比移到左边更好。在这里,我们不必得到所有1的连续序列,而只需要n个连续的1。@user2826957好的,这个想法应该仍然有效。确定1的数量在最后一个数组中等于n,并在原始数组中查找1s块中的0s数