【问题标题】:Introduction to algorithms type of algorithm算法介绍 算法类型
【发布时间】:2016-03-12 02:59:07
【问题描述】:

我正在学习算法,并且正在阅读“算法简介第 3 版”这本书,并在问题部分描述了下一个问题:

描述一个 O(n*log(n)) 时间的算法,给定一个包含 n 个整数的集合 S 和另一个整数 x,确定 S 中是否存在两个和正好为 x 的元素。

而且我不知道它是提出有序集合还是无序集合?

【问题讨论】:

  • 集合 S 最初是无序的。

标签: algorithm


【解决方案1】:

让 x 是你想要的总和。首先对数组进行排序。然后对于数组 (a[i]) 中的每个元素,使用二进制搜索查找数组中是否存在 (x-a[i])。

伪代码:

 sort(a,n)
 for i : 1 to n
     if(binary_search(a,i+1,n-1,x-a[i]))
          return true
 return false

其他方法: 排序后,用first和last两个指针检查:

 while(first < last) {
        if(a[first]+a[last] == x) return true;
        else if(a[first]+a[last] < x) first++;
       else if(a[first]+a[last] > x) last--;
    }
    return false;

【讨论】:

  • 我想你想要 while(first &lt; last) 否则当 x/2 出现在数组中时你会返回 true。
  • 是的,我的错。谢谢你:)
  • @user3763927 :如果你接受这个答案,如果它适合你,我将不胜感激。
【解决方案2】:

给定一个排序数组,您可以通过 O(n) 算术运算找到是否存在与 x 相加的对。

i := 0
j := len(A) - 1
while i < j {
    if A[i] + A[j] < x {
        i += 1
    } else if A[i] + A[j] == x {
        return true
    } else if A[i] + A[j] > x {
        j -= 1
    }
}
return false

鉴于此,您可以使用 O(n log n) 算术运算确定任何数组是否包含一对总和为 x 的元素,方法是对数组进行排序,然后使用上述算法。

【讨论】:

猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多