5

これはかなり一般的な質問のようです。悲しいことに、私はそれをSOで見つけることができませんでした。これが重複する質問の場合。申し訳ありません。

私が2つの整数配列を持っているAとしましょうB

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

A配列のいずれかの要素が配列のどの要素よりも小さい場合は、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ループを使用して、の要素がの要素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?ですが、意味がありませんでした。

4

2 に答える 2

18

はい、列挙可能なメソッド#anyを使用できますか?そして最小値

aの各項目について、max未満の場合はtrueを返します。

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

最初の配列の最小値を2番目の配列の最大値に対してチェックするだけで十分です。

a.min < b.max

この条件がfalseを返す唯一の方法は、すべての要素がbのすべての要素よりも小さい場合aです。

複雑さはO(m + n)であり、これはとの両方aを通る単一の反復bです。

于 2012-04-04T18:31:00.607 に答える