检查大小为 N 的 ArrayList 中是不是有两个数字的和为 N
Posted
技术标签:
【中文标题】检查大小为 N 的 ArrayList 中是不是有两个数字的和为 N【英文标题】:Check if in ArrayList of size N, there are two numbers which their sum is N检查大小为 N 的 ArrayList 中是否有两个数字的和为 N 【发布时间】:2018-10-10 18:24:34 【问题描述】:我有作业要做。 我必须实现一个算法,该算法必须检查一个大小为 N 的 ArrayList 是否至少有两个数字相加,它们的总和为 N。 算法的复杂度必须是 Theta(n log n)。 我已经知道我可以使用 Merge.Sort 或 Heap-Sort,然后我必须用数组列表的每个元素减去数组列表的大小。 问题是:按顺序减去复杂性,仍然是 Theta(n log n)?!? 如果没有,我该如何保持这种状态?
【问题讨论】:
【参考方案1】:使用任何排序算法对数组进行排序,最好是具有可接受顺序的排序算法,例如 (O(nlogn)) 的 mergeSort;
然后开始检查数组的第一个和最后一个元素并保留它们的索引,即'start'和'end。 当最后一个元素大于您想要的值时,将索引减一,然后将“开始”和“结束”的总和与您想要的值进行比较,
如果它大于你想要的值,你将找不到任何两个满足你条件的值,
如果它等于您想要的值,请报告“开始”和“结束”元素
如果它小于您想要的值,则增加“开始”索引 并再次进行比较,
重复直到两个索引相遇。
最终复杂度将是:O(n) + O(nlogn) 等于 O(nlogn)
【讨论】:
【参考方案2】:使用 MergeSort 对数组进行 O(n log n) 排序 然后对数组中的每条记录 r_i 使用二分查找对记录 N - r_i 进行查找,即 O(log n)
mergeSort 的 O(n log n) + n 次二分查找的 O(n log n) --> O(n log n)
【讨论】:
如果列表中有 3 个数字加起来为 N,这将如何工作?我认为问题本身可能无法以当前形式在 O(nlog n) 中解决。 (想知道) @Vamsidhar Reddy Gaddam 但是谁想要 3 个数字?我相信作者的意思是:pair with need sum 肯定存在。 放入一个ArrayList,大小为N,有“至少”两个数字相加,它们的和为N 复制自问题^ 这意味着 - 至少有一对(我同意公式不准确)以上是关于检查大小为 N 的 ArrayList 中是不是有两个数字的和为 N的主要内容,如果未能解决你的问题,请参考以下文章