【问题标题】: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)?!? 如果没有,我该如何保持这种状态?

【问题讨论】:

    标签: algorithm sorting mergesort heapsort


    【解决方案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
      • 复制自问题^
      • 这意味着 - 至少有一对(我同意公式不准确)
      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多