假设您有一组/列表/数字集合:[1,3,7,13,21,19](顺序无关紧要)。假设出于不重要的原因,您可以通过函数运行它们并接收以下对:
(1,13),(1,19),(1,21),(3,19),(7,3),(7,13),(7,19),(21,13),(21,19)。再说一遍,秩序无关紧要我的问题涉及到下一个部分:如何找出不需要重复就可以成为一对数字的一部分的最小数量?对于这个特殊的序列,它都是6。对于[1,4,2],这对是(1,4),(1,2),(2,4)在这种情况下,任何一个数字都可以被排除在外,因为它们都是成对的,但每一个数字都重复,因此它将是2(哪个2不重要)。
乍一看,这似乎是一个图遍历问题-数字是节点,对边。数学中有什么部分可以解决这个问题吗我没有问题写遍历算法,我只是想知道是否有一个解决方案具有较低的时间复杂度。谢谢!
最佳答案
如果你真的想找到最小值,答案是0,因为你根本不需要使用任何数字。
我猜你的意思是写“最大数量的数字”。
如果我正确理解你的问题,听起来我们可以把它翻译成以下问题:
给定一组n个数(1,…,n),什么是最大的数字量,我可以用它来把集合分成两对,每个数字只能出现一次。
这个问题的答案是:
当n=2k f(n)=2k时,k>=0
当k>=0时,n=2k+1f(n)=2k
我会用归纳法来解释。
如果n=0,那么我们最多可以使用0个数字来创建对。
如果n=2(集合可以是[1,2]),那么我们可以使用这两个数字
创建一对(1,2)
假设:如果n=2k,假设我们可以使用所有的2k数来创建2k对,并用归纳法证明我们可以使用2k+2数来表示n=2k+2。
证明:如果n=2k+2,[1,2,…,k,…,2k,2k+1,2k+2],我们可以使用2k个数(从我们的组合)创建k对。在不丧失一般性的情况下,假设输出对是(1,2),(3,4),…(2k-1,2k)我们可以看到,我们还有两个没有使用的数字[2K+1,2K+2],因此我们可以从其中两个数字中创建一对,这意味着我们使用了2K+2数字。
当n是奇数时,你可以自己证明这件事。