检查大小为 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的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是在字符串的 ArrayList 中

检查Java中的ArrayList中是不是存在Object

检查 ArrayList 是不是包含给定对象

java中怎么判断arraylist占用的内存空间大小

检查arraylist对象是不是存在

数据结构_ArrayList