用于在数组中搜索5个元素的总和的算法

问题描述 投票:1回答:1

[[我最近问了一个类似的问题,Search unsorted array for 3 elements which sum to a value 并得到了很好的答案,谢谢大家! :)]


我需要您的帮助来解决以下问题:我正在寻找一种算法,时间复杂度必须为ϴ(n³)

该算法在(n个整数)的未排序数组中搜索5个不同整数 给定z的总和。

例如:输入:({2,5,7,6,3,4,9,8,21,10} , 22)

输出应为true,因为我们可以求和2 + 7 + 6 + 3 + 4 = 22


(排序实际上并不重要。可以先对数组进行排序而不会影响复杂性。

所以您可以查看问题好像数组已经排序。]

-没有内存限制-

-我们只知道数组元素是n个整数。-

将提供任何帮助。

arrays algorithm search time-complexity big-o
1个回答
0
投票

算法:

1)生成由成对的初始整数组成的数组并将其排序。该步骤将花费O(n ^ 2 * log(n ^ 2))时间。

2)从初始数组中选择一个值。 O(n)种方式。

3)现在,您遇到的问题与链接的问题非常相似。您必须选择两对,以使它们的总和等于z-选择的值。值得庆幸的是,您有一个已排序的所有对的数组,长度为O(n ^ 2)。查找这样的对应该很简单-在3整数和问题中所做的相同。您创建两个指针,并将它们总共移动O(n ^ 2)次。

O(n ^ 3)总复杂度。

寻找与您选择的值组成的对可能会遇到一些问题。跳过由您选择的值组成的每对(当达到这样的对时,只要将指针移到不存在的位置,就可以将其进一步移动)。

假设您有两对p1和p2,使得sum(p1)+ sum(p2)+选择的值= z。如果p1和p2中的所有整数都不相同,则您有解决方案。如果没有,那就有点混乱了。

让我们修复p1,然后检查p2之后的下一个值。它可能具有与p2相同的和,因为两个不同的对可以具有相同的和。如果确实如此,则与p1的冲突肯定不会与与p2的冲突相同,但是您可能会与p1的另一个整数发生冲突。如果是这样,请检查p2之后的第二个值,如果它也具有相同的总和-绝对不会与p1发生任何冲突。

因此,假设至少有3对与p1或p2具有相同的总和,您将总能找到一个解决方案,检查固定p1的3个值或检查固定p2的3个值。

[剩下的唯一可能性是少于三对的和与p1相同,而少于三对的和与p2相同。您最多可以选择4种方式-仅检查每种可能性。

这有点令人不快,但是通过不断的操作,您就可以解决这些问题。这意味着总复杂度为O(n ^ 3)。

© www.soinside.com 2019 - 2024. All rights reserved.