algorithm - 检查大小为 N 的 ArrayList 中是否有两个数字的总和为 N

标签 algorithm sorting mergesort heapsort

我有作业要做。 我必须实现一个算法,该算法必须检查大小为 N 的 ArrayList 中是否至少有两个数字相加,它们的总和为 N。 算法的复杂度必须是 Theta(n log n)。 我已经知道我可以使用 Merge.Sort 或堆排序,然后我必须用数组列表的每个元素减去数组列表的大小。 问题是:按顺序减去复杂性,仍然是 Theta(n log n)?!? 如果不是,我该如何保持这种状态?

最佳答案

使用任何排序算法对数组进行排序,最好是具有可接受顺序的算法,例如 mergeSort,它是 (O(nlogn));

然后开始检查数组的第一个和最后一个元素并保留它们的索引,即“开始”和“结束”。 当最后一个元素大于您想要的值时,将索引减一,然后将“开始”和“结束”的总和与您想要的值进行比较,

如果它大于你想要的值,你将找不到任何两个满足你条件的值,

如果它等于你想要的值,报告'开始'和'结束'元素

如果它小于您想要的值,则增加“开始”索引 并再次进行比较,

重复直到两个索引相遇。

最终复杂度为:O(n) + O(nlogn) 等于 O(nlogn)

关于algorithm - 检查大小为 N 的 ArrayList 中是否有两个数字的总和为 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50104209/

相关文章:

c - 查找最大总和连续子数组

java - 分组和双重排序 List<Person>

c - 在 C 中进行合并排序时不断获取垃圾值

algorithm - 如何在逐字节比较之前首先检查文件是否相等?

python-3.x - 递归memoization解决方案 "count changes"

java - 用于计数数组反转的合并排序实现

c++ - 归并排序算法辅助

Excel VBA 集合合并排序

algorithm - 给定起始节点和结束节点,覆盖图中所有节点的最短路径

c - 如何在C中对一组结构进行排序