【问题标题】:minimum no of swaps required to make sure no two cats or dogs are at adjacent place确保没有两只猫或狗在相邻位置所需的最少交换次数
【发布时间】:2019-07-01 09:16:30
【问题描述】:

给定一个数组,数组的元素代表猫和狗。我们必须通过交换重新排列元素,使相邻的位置没有两只猫或狗。

注意:我们可以将数组的元素与任何元素交换。

Eg: given input: [d,c,d,c,c]
exp o/p: 2
Explanation : 
step 1: swap index-0 and index-1 =>[c,d,d,c,c]
step 2: swap index2 and index-3  =>[c,d,c,d,c]

input: [c,d,d,c,c,c]
exp o/p : not possible

【问题讨论】:

  • 如果您可以将一个元素与任何其他元素交换,那么问题非常简单 O(n) 并且您可以很容易地找到它。就像您在第一个示例中所做的那样,您只能与相邻元素交换,这将更加困难。

标签: arrays algorithm data-structures


【解决方案1】:
  1. 检查其中一个是否为n == m + 1n == m 是否为真。
  2. 如果不是这样,那是不可能的,return
  3. 如果n == m + 1 我们知道在所有偶数索引上必须有一个n,对于所有奇数索引必须有一个m
  4. 编辑: 如果n == m 的起始值很重要!如果交换次数是算法中最重要的部分,则在两种可能的变化上运行第 5 步,并比较结果子数组的长度。 [1]感谢@Ishpreet 指出这一点!
  5. 遍历数组,检查是否有nm。如果相应索引的值是错误的(例如,在索引 0 上,有一个 m 而不是 n,请注意数组中的索引向下是错误放置的 n'sm's
  6. 之后,根据两个子数组交换数组中写下的索引值。

[C、C、C、C、D、D、D、D]

错误的 C = [1, 3]

错误的 D = [4, 6]

交换(1,4)和(3,6)

结果:[C, D, C, D, C, D, C, D]

[1] 算法的复杂度不会因此而改变。

【讨论】:

  • 您仍然需要比较两个展示位置(偶数和奇数)。就像CDCDCDCDDC 数组的情况一样。预期的数组可以是DCDCDCDCDCCDCDCDCDCD。因此,您必须将两者进行比较,以找出哪一个需要最少的交换次数。
  • @assoron,是否可以在不实际交换的情况下预测最小交换?
  • 取决于你的预测是什么意思?您需要有关元素数量和位置的某些信息来进行预测,所以我看不出您将如何在第 6 步(即交换本身)之前删除上述任何步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2020-12-10
  • 2019-11-14
  • 2021-12-08
  • 1970-01-01
  • 2020-02-12
  • 2012-03-30
相关资源
最近更新 更多