【问题标题】:Given N lengths, determine if it is possible to form a triangle in O(N) time [duplicate]给定N个长度,确定是否有可能在O(N)时间内形成一个三角形[重复]
【发布时间】:2017-11-12 12:11:00
【问题描述】:

您好,我很难在 O(N) 时间内解决这个问题。

输入由 N 个介于 1 - 10^9 之间的整数组成,输出应确定是否可以使用给定值中的任意 3 个来形成三角形。 N 的限制达到 10^8,所以我的解决方案必须在 O(N) 时间内运行。

所以我知道三角不等式,但是使用不等式比较所有数字将在 O(NC3) 时间内运行,这将超过允许的复杂度?我可以就正确的解决方案获得一些帮助吗?

【问题讨论】:

  • 例如,整数 3 1 4 7 中的任意 3 个不可能组成三角形,但整数 6 7 8 9 10 可以组成一个三角形
  • 如果整数已排序,那么 O(N) 解决方案相对简单——所以我猜它们没有排序?
  • @ArnaudDenoyelle: 1000 1 3 3 3,最大的两个是1000和3,最小的是1,单独分析它们会说不可能有三角形
  • 整数未排序,但我认为在解决方案之前对输入进行排序仍然可以接受
  • @BryanJuniano - 排序通常需要 O(N log N)。如果没问题,那么我会发布一个答案。

标签: algorithm math computer-science adhoc


【解决方案1】:

三角不等式states

三角形任意两条边的长度之和必须大于或等于第三条边的长度。

这意味着:

最短两条边的长度之和必须大于或等于最长边的长度。

所以我们依次取出(排序的)整数,并将其与前两个整数的总和进行比较。如果它们满足不等式,那么我们就找到了一个三角形。如果他们不满足它,那么我们知道也没有更小的一对可以满足它。

这个过程是 O(N),但它需要对列表进行排序。一般来说,排序在 O(N log N) 中运行,但如果你有有限域的整数,理论上你可以在 O(N) 中使用 counting sort(以 O(N) 内存为代价)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多