Arrays 在数组中搜索求和为一个值的5个元素的算法
[我最近问了一个类似的问题, 得到了精彩的答案,谢谢大家!:)]Arrays 在数组中搜索求和为一个值的5个元素的算法,arrays,algorithm,search,time-complexity,big-o,Arrays,Algorithm,Search,Time Complexity,Big O,[我最近问了一个类似的问题, 得到了精彩的答案,谢谢大家!:)] 我需要您的帮助来解决以下问题: 我正在寻找一种算法,时间复杂度必须是ϴ(n³) 该算法在未排序的数组(由n个整数组成)中搜索5个不同的整数 求和为给定的z 例如:对于输入:({2,5,7,6,3,4,9,8,21,10},22) 输出应该是true,因为我们可以求和2+7+6+3+4=22 (排序并不重要。可以先对数组进行排序,而不会影响复杂性 因此,您可以将问题看作数组已排序的问题 -没有内存限制- -我们只知道数组元素是n
我需要您的帮助来解决以下问题:
我正在寻找一种算法,时间复杂度必须是ϴ(n³) 该算法在未排序的数组(由n个整数组成)中搜索5个不同的整数
求和为给定的z 例如:对于输入:
({2,5,7,6,3,4,9,8,21,10},22)
输出应该是true
,因为我们可以求和2+7+6+3+4=22
(排序并不重要。可以先对数组进行排序,而不会影响复杂性 因此,您可以将问题看作数组已排序的问题 -没有内存限制- -我们只知道数组元素是n个整数- 欢迎提供任何帮助。算法: 1) 生成由初始整数对组成的数组并对其排序。该步骤将花费O(n^2*log(n^2))时间 2) 从初始数组中选择一个值。O(n)方式 3) 现在你有一个与链接的问题非常相似的问题。您必须选择两对,使其总和等于z选择的值。谢天谢地,您已经有了一个长度为O(n^2)的已排序的所有对的数组。找到这样的对应该很简单——和你在3整数和问题中做的一样。你做了两个指针,总共移动了O(n^2)次 O(n^3)总复杂性 在查找由所选值组成的对时,您可能会遇到一些问题。跳过由您选择的值组成的每一对(当您到达这样一对时,只需进一步移动指针,就像它从未存在过一样) 假设有两对,p1和p2,求和(p1)+求和(p2)+选择值=z。如果p1和p2中的所有整数都不同,那么就有了解决方案。如果没有,那就有点乱了 让我们修复p1并检查p2之后的下一个值。它可能与p2具有相同的和,因为两个不同的对可以具有相同的和。如果是这样的话,你肯定不会与p1发生与p2相同的冲突,但是你可能会与p1的另一个整数发生冲突。如果是这样,检查p2之后的第二个值,如果它也有相同的和——它肯定不会与p1发生任何冲突 因此,假设至少有3对与p1或p2的和相同,您将始终找到一个解决方案,检查固定p1的3个值或检查固定p2的3个值 剩下的唯一可能性是,与p1具有相同总和的对少于3对,与p2具有相同总和的对少于3对。您最多可以通过4种方式选择它们——只需检查每种可能性 这有点令人不快,但在不断的操作中,您能够处理此类问题。这意味着总复杂度为O(n^3)。算法: 1) 生成由初始整数对组成的数组并对其排序。该步骤将花费O(n^2*log(n^2))时间 2) 从初始数组中选择一个值。O(n)方式 3) 现在你有一个与链接的问题非常相似的问题。您必须选择两对,使其总和等于z选择的值。谢天谢地,您已经有了一个长度为O(n^2)的已排序的所有对的数组。找到这样的对应该很简单——和你在3整数和问题中做的一样。你做了两个指针,总共移动了O(n^2)次 O(n^3)总复杂性 在查找由所选值组成的对时,您可能会遇到一些问题。跳过由您选择的值组成的每一对(当您到达这样一对时,只需进一步移动指针,就像它从未存在过一样) 假设有两对,p1和p2,求和(p1)+求和(p2)+选择值=z。如果p1和p2中的所有整数都不同,那么就有了解决方案。如果没有,那就有点乱了 让我们修复p1并检查p2之后的下一个值。它可能与p2具有相同的和,因为两个不同的对可以具有相同的和。如果是这样的话,你肯定不会与p1发生与p2相同的冲突,但是你可能会与p1的另一个整数发生冲突。如果是这样,检查p2之后的第二个值,如果它也有相同的和——它肯定不会与p1发生任何冲突 因此,假设至少有3对与p1或p2的和相同,您将始终找到一个解决方案,检查固定p1的3个值或检查固定p2的3个值 剩下的唯一可能性是,与p1具有相同总和的对少于3对,与p2具有相同总和的对少于3对。您最多可以通过4种方式选择它们——只需检查每种可能性
这有点令人不快,但在不断的操作中,您能够处理此类问题。这意味着总的复杂度是O(n^3)。关于“混乱的事情”——我根据总和(每对的总和,升序)对数组进行排序。它不会影响复杂度,因为它只执行一次。现在,我可以检查它是否小于、等于或大于我需要的值。现在它与另一个问题完全相同。是的,但是你仍然想要有5个不同的整数。选择具有正确总和的对并不一定能提供这一点(您可以选择两个对,它们的总和确实达到您所寻找的值,但它们可能包含相同的元素,如果我正确理解您的问题,这是错误的)对的。所以每次,如果它等于这个值,我检查所有五个元素,如果有相等的元素,我不返回true,而是继续。基本上是的。如前所述,当左指针位于对I上,右指针位于对j上时,不要只检查对I和j,还要检查对(I+1,j)、(I+2,j)、(I,j-1)、(I,j-2)、(I+1,j-1)和(I+2,j-2)。这样你就可以确保你不会