arrays - 用于在数组中搜索总和为一个值的 5 个元素的算法
问题描述
[我最近问了一个类似的问题, Search unsorted array for 3 elements which sums 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个整数。-
任何帮助都将不胜感激。
解决方案
算法:
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) + selected value = 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)。
推荐阅读
- android - 无法在一个解决方案中启动第二个 Android 项目
- windows - 在没有管理员权限的情况下安装 Windows 设备驱动程序
- testing - Testcafe 角色如何在幕后工作
- laravel - 从数据库输出数据到模板 Laravel 5.7
- javascript - 反应延迟滚动onClick
- iis - 绑定过多会破坏 Windows 身份验证
- c - 无法跟踪使用 ptrace 和 seccomp 调用 execve 的子进程的系统调用
- python - 调用 urllibb 时出现 Python 脚本错误
- sql - 如何从另一个表中为每个位置检查sql中的字符串
- terminal-emulator - 如何关闭滚动字符