【发布时间】:2021-04-13 05:07:42
【问题描述】:
我需要一些帮助来解决我一直面临的这个问题 假设我有一个数组=[3,4,1,5,6,1,3]
现在我需要重复元素 3 不应位于其他 3 旁边且与 1 相同的排列。 我想怎么解决这个我看了很多 YouTube 并用谷歌搜索但没有运气 在此先感谢您的帮助。,,,
【问题讨论】:
标签: math permutation
我需要一些帮助来解决我一直面临的这个问题 假设我有一个数组=[3,4,1,5,6,1,3]
现在我需要重复元素 3 不应位于其他 3 旁边且与 1 相同的排列。 我想怎么解决这个我看了很多 YouTube 并用谷歌搜索但没有运气 在此先感谢您的帮助。,,,
【问题讨论】:
标签: math permutation
您是在寻找通用案例解决方案还是仅针对特定阵列?如果您正在寻找更一般的情况,我认为您应该指定限制或问题变得过于复杂。如果您想编写代码,同样适用。一些语言(如 Python)具有使这些工作相对简单的库,但时间复杂度可能会变得很难看。
这是解决问题的数学方法:
第 1 步:假设所有元素不同 a = [3,4,5,6,1]
在这种情况下,我们将有 5 个!不同的选项(您有 5 个选项可以选择第一个元素,4 个选项可以选择第二个元素,依此类推)
第 2 步:假设您有一个重复元素 a = [1,3,4,5,6,1]
在这种情况下,我们有 6!/2!不同的选项(6!来自第 1 步,我们将其除以 2!因为如果将重复元素的位置切换到自身,则数组不会有机会)。
现在您要排除重复元素彼此相邻出现的选项。诀窍是将它们视为一个元素。所以现在我们有一个 = [(1,1), 3, 4, 5, 6]。有5个!不同的选择。我们从总数中减去这个,即 6!/2! - 5!会给你答案。
第 3 步:(您的情况)两个重复元素 a = [3,4,1,5,6,1,3]
我们继续同样的逻辑。我们总共有 7!/(2!x2!) 个选项。从第 2 步开始,如果我们想排除 1 出现在 1 旁边的情况,那么我们必须减去 6!从总数。我们也有 3 个出现两次。所以,我们将再减去 6!从总数。不幸的是,我们两次减去了一些案例(你能猜到是哪一个吗)。如果我们找出哪些案例我们减去了两次并将它们相加,我们就会得到答案。
我们减去两次的情况是1在1之后同时3在3之后,即a = [(1,1),4,5,6,(3,3)]。我们已经为一和三减去了这些选项。有5个!类似的情况(你能猜到为什么吗?)。
对某些人来说,得到 7!/(2!x2!) - 2x6! + 5!。
如果您不是在寻找通用解决方案,那么这些数字并不大,因此您可以编写一个蛮力代码(为了节省一些时间/空间,将数组转换为字符串)。
我可能在计算中遗漏了一些东西,但如果你遵循逻辑,你就会得到答案。此外,如果您想了解为什么这些事情有效,请尝试使用小数据来获得直觉。如果您需要代码,请告诉我。我会更新解决方案。
【讨论】: