【问题标题】:check whether any number in one array is less than some number in the other array检查一个数组中的任何数字是否小于另一个数组中的某个数字
【发布时间】:2012-04-05 02:58:24
【问题描述】:

这似乎是一个很常见的问题。可悲的是,我在 SO 上找不到它。如果这是一个重复的问题;我为此道歉。

假设我有两个整数数组AB

A = [17, 3, 9, 11, 11, 15, 2]
B = [1, 13]

如果数组A 的任何元素小于数组B 的任何元素,我需要返回真或假。

最简单的方法是每个循环使用 2 个(O(n^2) 复杂度)

def is_greater?(a,b)
  retVal = false
  b.each { |element|
    a.each { |value|
      if (value < element)
        retVal = true
        break
      end
    }
  }
  return retVal
end

is_greater?(A,B) => true

我还整理了两个数组中的元素,然后用一个while循环判断A中的元素是否小于B中的元素。

A.sort!
B.sort!
def is_greater?(a,b)
  retVal = false
  i = 0
  j = 0
  while (i < a.length && j < b.length)
    if (a[i] < b[j])
      retVal = true
      break
    elsif (a[i] == b[j])
      i = i + 1
      j = j + 1
    else
     j = j + 1
    end
  end
  return retVal
end

is_greater?(A,B) => true

我想知道在代码行数方面是否有一种高效、精确的方法。我试图弄清楚如何使用 any? 块,但这对我来说没有任何意义。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    是的,你可以使用枚举方法#any?和#min

    对于a中的每一项,如果小于max则返回true:

    max = b.max
    a.any?{|x| x < max}  
    

    【讨论】:

    • 谢谢!我将此解决方案与@TCopple 给出的最大值存储建议一起使用
    【解决方案2】:

    只检查第一个数组的最小值和第二个数组的最大值就足够了。

    a.min < b.max
    

    此条件返回 false 的唯一方法是每个元素 b 小于 a 中的每个元素。

    复杂度为 O(m+n),即通过 ab 的单次迭代。

    【讨论】:

    • 至少它是线性的,而不是我提出的 O(nlogn) 和 O(n^2) 解决方案。感谢您提供最大值缓存提示
    • m ~= n 时实际上是O(2n) = O(n)(带常数的乘积规则),而不是O(n logn)。它与其他解决方案相同。
    • @texasbruce 我不知道您是否在谈论我的解决方案,但如果您同意,我同意它会降低到与其他答案相同的复杂性。但是.... m = len(a) 和 n = len(b),这不是 O(2n),因为 n 只能表示一个数组的长度。
    • @texasbruce O(n logn) 是我给出的排序解决方案的复杂度,TCopple 的解决方案的复杂度为 O(m+n).. 本质上是线性的
    • @TCopple 问题是任何元素而不是每个元素都必须小于
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多