5

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

假设我有两个整数数组AB

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

A如果 array的任何元素小于array 的任何元素,我需要返回 true 或 false 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 循环来确定 in 中的元素A是否小于in 中的元素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?块,但这对我来说没有任何意义。

4

2 回答 2

18

是的,您可以使用 Enumerable 方法#any?和#min

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

max = b.max
a.any?{|x| x < max}  
于 2012-04-04T18:16:16.997 回答
5

It should be enough to just check the minimum of the first array against the maximum of the second.

a.min < b.max

The only way this conditional returns false is if every element is b is less than every element in a.

The complexity is O(m+n) which is the single iteration through both a and b.

于 2012-04-04T18:31:00.607 回答